Jor*_*amp 10 c makefile linux-device-driver linux-kernel
我正在尝试按照本指南编译一个简单的hello world模块,我对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
Run Code Online (Sandbox Code Playgroud)
据我所知,当我输入make命令时,它将运行运行的all配方make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules.所以现在它运行在-C标志后给出的路径上找到的Makefile,但它做了M=$(PWD) modules什么?
小智 12
' all and clean ': - 如果你默认运行'make',它将运行"all:".但我们可以使用all和clean with make.它只会运行那些特定的命令.
Example :-
'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"
Run Code Online (Sandbox Code Playgroud)3." uname -r ': - 获取有关当前内核的名称和信息.
Example :- for me, my kernel is "4.6.0-rc1".
Run Code Online (Sandbox Code Playgroud)
选项' -C dir ': - 在读取makefile之前更改目录dir.
Example :- "make -C /lib/modules/$(shell uname -r)/build" will change to "make -C /lib/modules/4.6.0-rc1/build.
Run Code Online (Sandbox Code Playgroud)现在,您希望使用" make -C/lib/modules/$(shell uname -r)/ build M = $(PWD) modules" 来创建可加载模块.
您的源代码需要运行环境.这就是我们必须使用-C选项来更改构建目录的原因.哪些都需要定义,头文件,宏等等.现在更改为构建目录后,您需要告诉您的模块在哪里,这就是我们使用M = $ PWD的原因.
要编译内核模块,make通常需要使用以下形式的命令:
make -C /lib/modules/3.16.0-70-generic/build M=/home/test/ldd3/hello modules
Run Code Online (Sandbox Code Playgroud)
其中,-C表示切换到另一条路径。
/lib/modules/3.16.0-70-generic/
Run Code Online (Sandbox Code Playgroud)
是所用内核的路径,并且
/home/test/ldd3/hello
Run Code Online (Sandbox Code Playgroud)
是模块源所在的位置。
M = $(PWD)模块有什么作用?
因此,正如我所说的,M=$(PWD)它只是一个shell变量,用于存储内核模块的当前路径。make在切换到内核构建路径时需要存储它。
| 归档时间: |
|
| 查看次数: |
10109 次 |
| 最近记录: |