Linux中的Makefile是重要的编译文件,通常待编译文件在同一目录下可以简单的直接利用依赖关系写出Makefile。那么如果要在父目录执行make指令达到在子目录只生成.o文件,而在父目录生成可执行文件,该如何操作呢?
那么这时就需要进行Makefile嵌套使用了。所以我们第一步就是在子目录和父目录各建一个Makefile文件。我们以以下目录为例。
csc为父目录,code为子目录。现在两个目录下都有了Makefile,我们开始进行内容的编写。
我们要达到的目的是将fibo.c和main.c在code目录下生成fibo.o和main.o,在csc目录下生成可执行文件fibo。
采用自底向上的编写方式,先写code里的Makefile:
其中-I../include是去include文件夹内寻找.h头文件进行编译,否则会报编译错误。clean的作用是去除.o文件。这样我们code的编写就成功了,我们可以先在code目录下运行一下,检查正确性。
code目录下运行成功后,我们可以写顶层Makefile了。
这里注意,千万不要写`include ./code/Makefile`!否则会导致调用不成功。
这个Makefile本人使用了两种方法进行子目录Makefile调用。
第一种是`cd code && make`,这是进入子目录并执行make指令。此时子目录已经出现编译好的.o文件了。再`cd ..`,回到本目录(父目录),进行本目录要执行的make操作,即将code目录下的,o文件链接成可执行文件-fibo,且这个可执行文件在csc目录下(父目录)。
第二种是`$(MAKE) clean -C ./code`。这和第一种方法效果相同,只不过写法不同。这行代码的含义是进入./code目录执行make clean操作。使用第二种方法更简洁,不用手动切换回父目录。
不过,为了可读性和可维护性,建议使用第一种方法。第二种方法在Makefile较简单时,比较适用。
希望对正在学习Linux编写Makefile的大家有所帮助。