你好世界生成文件

你好世界生成文件

任何人都可以解释下面给出的简单 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

答案1

事实上你有两个目标(allclean)。当您在文件夹中时,可以通过make all或 来在控制台上调用它们make clean。第一个目标始终是默认目标(make结果为make all)。

缩进了食谱被指出。这是 make 执行来构建目标的代码。所以调用make将导致调用

make −C /lib/modules/$(shell uname −r)/build M=$(PWD) modules

当然,shell 扩展了uname命令和M环境变量。然后make在指定的文件夹 ( /lib/modules/$(shell uname −r)/build) 中使用目标进行调用modules。这个目标(子进程)的作用显然没有在这个文件中指定。这意味着,还有/lib/modules/$(shell uname −r)/build另一个Makefilemodules定义了目标。上面列出的命令modules/lib/modules/$(shell uname −r)/build/Makefile.

对于目标也是如此clean。这将发出一个子进程,其clean目标位于指定文件夹中。

这两个目标的想法是具有两个显着特征。第一个 ( all) 是构建一些东西(可能是你的模块)。另一个是清理你的工作(clean),以防编译出错并且你想删除任何非源文件。然而,这种对目标的解释只是从名称上看的。这取决于它们的实施。如果您愿意,您可以将它们命名为t1t2、 。然而,它的可读性比, , andt3差得多。allcleaninstall

第一行将一个字符串附加hello−1.o到 vaiable 中obj−m。由于该变量之前为空(如果没有通过外部环境变量设置),因此只需将其设置为该值即可。但是,该值未经过export编辑,因此仅在本地可见。所以它对子进程没有影响(参见这个链接)。


补充一点:我错了,obj-m没有效果。Makefile由内核重新读取并Makefile搜索以 开头的变量obj-。然后将它们用于编译所需的目标文件。来源:https://stackoverflow.com/a/21140538/882756

相关内容