Makefile学习
一 程序从源码到可执行文件的过程:参考编译的工作工程
简单的单文件编译非常简单,通过GCC可以把“.c”变成“.o”文件然后可以直接运行;
而复杂一点的程序都需要经过三步:
1 $ ./configure 2 $ make 3 $ make install
说明:
- step1:通过autoconf工具进行配置,保存会生成configure的脚步配置文件(包含了编译环境所需的一切参数)。
- step2:通过make工具操作configure文件会生成makefile文件(包含了头文件位置,相互调用依赖关系),然后经过头文件的预编译(只进行一次),预处理(宏替换),编译(.s汇编文件),汇编(.o目标文件)链接(将所调用的函数或所需的文件静态放到指定位置。最终成为完整的二进制文件.out文件),安装(将可执行文件保存在指定存储位置。)
- make install:通过操作系统的连接(通过操作系统新可执行APP的信息:支持的扩展名和打开方式)类似Windows下的应用程序快捷方式。最后在经过打包生成安装包。
静态链接和动态链接的区别:
- 静态链接:静态的将所需资源进行替换,优点:完整,不会出现运行缺少文件现象,文件大;
- 动态链接:运行时才加载所需资源库,可执行文件尺寸小的优点,但必须提供文件名,版本完全一致的文件于指定目录下,否则可执行程序会因缺失相关文件而不能运行。
二 细节 Makefile经典教程(掌握这些足够) 《跟我一起写Makefile》pdf
注意:Makefile 中的命令,必须要以[Tab]键开始
文件名:默认Makefile,次推荐的是makefile/GNUmakefile.自定义文件名也是可以的需要用make -f file.扩展名
文件包含:-include <filename> 类似C的文件包含,前面加-表示如果找不到也不要报警。文件包含可以指定“-I”或“--include-dir”参数;环境变量MAKEFILE有类似文件包含的左右,如果出现古怪问题看是不是这个原因造成的。
特殊通配符符号:
- ~:“~/test”,这就表示当前用户的$HOME目录下的test目录。而“~hchen/test”则表示用户hchen的宿主目录下的test目录。
- *:所有类似文件
- %:%.c表示匹配0或者若干个字符。譬如在文件搜索用make的特殊变量VPATH = src:../headers或者是关键字vpath <pattern> <directories>
- -M:C编译器的-M参数会自动为我们找出模块.C文件中依赖的所有头文件;如果是GNU的C/C++编译器则要改为-MM参数不然会将标准库文件也包含进来。
2.1伪目标:因为伪目标不能和工程中的文件名重复所以用.PHONY是为了告诉系统这是个伪目标,无论是否重名
.PHONY: clean clean: rm *.o temp
三命令:
3.1 echo:显示要执行的命令。当@echo时不显示;-n/--just-print则只显示不执行命令;-s/--slient全面禁止命令的显示。
3.2命令执行:
- 要让上一条命令的结果应用在下一条命令时,你应该将2个命令写在同一行,且中间使用分号分隔这两条命令。
- 忽略命令错误:make是逐条执行命令,当一个命令出错时会终止运行,此时有以下几种方法可以忽略错误保证继续执行:
- 命令前加“-i/--ignore-errors”:这会影响全局所有命令
- 命令前加“-”:
- 命令前加“-k/--keep-going”: