让编译更智能一点
环境:ubuntu 18.04
背景知识
make是一个自动化编译工具,手动编译链接的烦恼由它来解决。
如果你的系统没有安装它的话(可以键入 make -version
来检查),不妨试着键入sudo apt-get install make
来安装。
要使用make,需要编写makefile,这个文件主要描述所需的目标文件和文件之间的依赖关系、告诉make如何去执行指令来实现"自动化"的编译。
步骤
- 首先,准备好一个多文件的程序,放在某个目录下,例如hello.c(提供一个sayhello()函数)和test.c(main函数中调用sayhello()),之前编译过的话最好清掉生成的文件。
然后,在同一目录下
vim makefile
新建一个makefile文件,键入如下内容并保存退出:test : test.o hello.o cc test.o hello.o -o test test.o : test.c cc -c test.c hello.o : hello.c cc -c hello.c
makefile的内容主要就是如下内容的重复:
目标 : 依赖的文件
要执行的命令
然后,键入指令
make
,可以注意到make自动执行了如下的指令:gcc -c test.c gcc -c hello.c gcc test.o hello.o -o test
如果把单独删掉test,然后再执行一次make,会发现make执行了如下的指令:
gcc test.o hello.o -o test
- 可以注意到,make会根据指令的依赖关系、结合文件的存在情况来执行操作。另外,请注意make会把出现的第一个目标作为最终的目标,也是检查依赖性和文件存在情况的起始点。
- 最终,手动完成makefile的编写以后,如果我们修改了源文件,删除原本存在的目标文件(rm 文件名称)以后执行
make
指令即可得到新的目标文件。
补充
make的自动推断
我相信你肯定有这种感觉——hello.o : hello.c ...
这样的语句也太傻气了,我就是想要把C文件编译成同名的.o文件嘛,能不能智能一点?
其实是可以的。make有自动推导的能力,可以自动把依赖关系中出现的.o文件的同名.c文件加到依赖关系中。然后,如果这个.o文件不存在或待更新的话,make就会执行对应指令来生成它。
了解了这一点后,我们的makefile可以改写成这样:
test : test.o hello.o
cc test.o hello.o -o test
make中的变量
简单地说,make中的变量就像是C语言中的宏,其内容是一个文本字串,使用的时候会按原样在出现的地方展开。
变量定义的方式如下:
objects = test.o hello.o
变量使用的例子如下:
test : $(objects)
cc $(objects) -o test
所以,了解了make中的变量以后,我们的makefile可以改成这样:
target = test
objects = test.o hello.o
$(target) : $(objects)
cc $(objects) -o $(target)
make中的clean
你肯定觉得每次更新目标文件之前需要先把它手动删除显得不太聪明——还好,有稍微“自动化”一点的方案,那就是添加clean。
clean使用的例子如下(通常建议这部分内容放在makefile的结尾):
clean :
rm test $(objects)
由于找不到依赖关系,所以,使用指令make
时clean后跟的指令并不会被执行,如果想要执行这部分内容,需要键入make clean
关于make的其他
还没写呢2333,看看参考链接吧。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。