make笔记
Makefile基本格式如下: target ... : prerequisites ... command ... ... 其中, target - 目标文件, 可以是 Object File, 也可以是可执行文件 prerequisites - 生成 target 所需要的文件或者目标 command - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头
Makefile 中书写shell命令时可以加2种前缀 @ 和 -, 或者不用前缀.
3种格式的shell命令区别如下:
不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行
前缀 @ :: 只输出命令执行的结果, 出错的话停止执行
前缀 - :: 命令执行有错的话, 忽略错误, 继续执行
Makefile的退出码有以下3种: 0 :: 表示成功执行 1 :: 表示make命令出现了错误 2 :: 使用了 "-q" 选项, 并且make使得一些目标不需要更新
编译C时,<n>.o 的目标会自动推导为 <n>.c # Makefile 中 main : main.o gcc -o main main.o #会自动变为: main : main.o gcc -o main main.o main.o: main.c <-- main.o 这个目标是隐含生成的 gcc -c main.c
Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下: 自动变量 含义 $@ 目标集合 $% 当目标是函数库文件时, 表示其中的目标文件名 $< 第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标 $? 比目标新的依赖目标的集合 $^ 所有依赖目标的集合, 会去除重复的依赖目标 $+ 所有依赖目标的集合, 不会去除重复的依赖目标 $* 这个是GNU make特有的, 其它的make不一定支持
变量名 含义 RM rm -f AR ar CC cc CXX g++ ARFLAGS AR命令的参数 CFLAGS C语言编译器的参数 CXXFLAGS C++语言编译器的参数
伪目标 含义 all 所有目标的目标,其功能一般是编译所有的目标 clean 删除所有被make创建的文件 install 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去 print 列出改变过的源文件 tar 把源程序打包备份. 也就是一个tar文件 dist 创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件 TAGS 更新所有的目标, 以备完整地重编译使用 check 或 test 一般用来测试makefile的流程
严以律己、宽以待人