Makefile的复杂案例
上文通过一个简单的介绍了Makefile文件的编写使用,本篇文章通过一个比较复杂的例子来加深对makefile的理解。
Makefile文件编写的优势就是不需要重复的写大量的命令行,减少工作量同时减低错误率。所以就用多文件链接来作为例子。
案例
文件包含关系为
把foo.c ,bar.c, main.c,这三个文件进行链接生成main可执行文件
一般情况下会把除main函数外的文件先用gcc -c filename 指令生成 .o 文件,再和main函数进行连接。
这样做的好处是:当只改变了foo.c文件,foo.o需要重新生成,但是bar.o文件没有改变,不需要重新进行编译,节省了时间。
编写Makefile文件
解释:
- 写一个我们要生成可执行文件的代码main,然后main里面有3个依赖文件,main.c,bar.o,foo.o。main.c文件已经存在,不需要生成。但是bar.o和foo.o不存在需要写一段代码来执行生成.o文件。其中生成foo.o文件需要foo.c文件,所有foo.c文件是生成foo.o代码的依赖文件。bar.o的生成和foo.o是一样的过程。最后就是写一个clean的删除文件操作,*.o表示所有后缀为.o的文件。
- 运行
生成了.o文件和最终需要的可执行文件main
通过make clean 删除了.o文件和main文件。
Makefile执行的过程
首先读取main标签,有3个依赖文件main.c,bar.o,foo.o。然后会跳到生成依赖文件的代码段,如foo.o就会跳到foo.o标签处。
为了读者理解,这里用一个例子
Makefile执行过程案例
这里有2个主函数,需要生成2个和执行文件main_bar和main_foo
按照上面的编写思路得到的Makefile代码为:
可以看到make以后识别了main_foo标签,根据该标签的依赖文件foo.o跳转到了foo.o标签执行。没有执行main_bar标签。
那么要如何生成多个可执行文件呢
上面我们可以看出,读取标签后对根据标签的依赖文件进行查找对应标签执行,只要我们把上面两个标签作为依赖文件就可以执行到这两个标签,具体代码如下
执行结果
Makefile编写的其他技巧
上面可以看出经常出现gcc,当我们需要改变编译器时就需要一处一处改,太浪费时间,这时我们可以通过定义变量的方法来解决这个问题
用$符号来访问字符串,-c -l -g 这些字符也可以用字符串来表示