每次从一个目录更改为另一个目录并从那里调用make时,对象文件就会被编译

时间:2015-09-08 11:33:01

标签: c linux makefile linux-kernel

以下是我的测试项目的详细信息

myproject/
|
|- Makefile1
|- test_module.c
|- test/
     |- Makefile2

以下是我的make文件的内容

Makefile 1:

obj-m:=test_module.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;

Makefile2:
obj-m:=../test_module.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;

当我在myproject目录中调用make时,test_module.o正在编译。如果我cd到test/目录并调用make,则再次编译test_module.o。那不是我预期的行为。由于已经编译,因此不应再次编译test_module.o。它应该使用该目标文件来生成相应的可执行文件或内核模块。我在这里想念任何东西吗?

1 个答案:

答案 0 :(得分:1)

是的,在Linux内核构建系统中,对象文件不会被重用于不同的目标(例如,内核模块)。

这是由辅助构建文件引起的,与对象文件一起存储。例如,在您的情况下.test_module.o.cmd使用到test_module.o的确切路径。当Makefile1创建文件时,此路径以test_module.o结尾,但当Makefile2有问题时,路径以test/../test_module.o结束。