我正在尝试编译一个简单的 hello world 模块guide我很困惑Makefile
实际上正在做。
这里是:
obj-m += hello-1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
我明白当我输入make
命令它将运行all
运行的食谱make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
。所以现在它运行在后面给出的路径中找到的Makefile-C
标志,但是什么是M=$(PWD) modules
do?
这是一个细分:
-
obj-m
:指定构建为可加载内核模块的目标文件。
-
all
and clean
: 如果你跑步的话make
默认情况下它将运行第一个目标,即all
。但我们可以使用make all
and make clean
同样:它只会运行那些特定的目标。
例如:
make all
# Will run: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
make clean
# Will run: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
-
uname -r
:获取当前内核的版本信息。
示例:对我来说,输出是4.6.0-rc1
.
-
Option -C dir
: 切换到目录dir
在阅读其中的 makefile 之前。
Example:
make -C /lib/modules/$(shell uname -r)/build
# Will translate to: make -C /lib/modules/4.6.0-rc1/build
# And execute the Makefile at /lib/modules/4.6.0-rc1/build/Makefile
-
$(PWD)
:获取当前目录的路径。
现在您想使用以下命令创建可加载模块:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
您的源代码需要特定的环境才能编译。这就是为什么我们必须使用-C
更改构建目录的选项。其中包含所有需要的定义、头文件、宏等。现在,在更改到构建目录后,您可以使用以下命令告诉内核 Makefile 模块所在的位置M=$(PWD)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)