Make是一个简便的批量编译软件,会根据与源码同文件夹下的makefile进行编译。
一个Make文件格式如下:
VARIABLES = .... # 这不是必须,如果有的话变量名大写,第一个 = 之后全部识别为变量内容
all:InstructionName1 InstructionName2 ....
InstructionName1:Prerequisite 1
<Instruction Name1 所需要的Shell操作>
InstructionName2:Prerequisite 2
<Instruction Name2 所需要的shell操作>......
PHONY:clean all #.PHONY 表示这两个instruction不会成为文件夹中的文件
clean: # 一般最后一个步骤都会包含clean动作去掉之前生成的所有文件
rm InstructionName1 InstructionName2 ... InstructionNameN
用第一个instruction解释,当我们执行一个instruction时:
1. make程序会首先确认当前文件夹没有叫做instructionName1的文件,以及对应的shell操作中是否由更新的文件
2. 然后检查prerequisite的步骤(prerequisite由instructionName组成)是否完成。
3. 若prerequisite都完成且当前的shell操作中包含更新的文件,则执行当前的shell操作。
4. 若没有完成prerequisite的操作,则首先执行prerequisite同名的instruction
5. 若当前的shell操作没有更新的源文件,则直接返回完成,若有,则执行操作。执行时会print出执行的操作,然后表示操作完成。
进阶操作:
— 变量:例子中VARIABLE就是一个变量,后文在具体shell命令中可以用 $(VARIABLE) 替换第一行 VARIABLE = 之后的所有内容
— $@ 表示指令所在的目标名(InstructionName)
— $< 表示第一个prerequisite项
— $? 表示所有已经有更新版本的prerequisite
— $^ 表示所有的prerequisite
静态目标/指令(以不变应万变):
— % 表示任何符合它在的句子格式的内容。例如 %.o 代表任何 .o 文件。
— 若instructionName包含多个名称,则相当于合并两个文件的相同操作。使用方法如下:
<target names>: <想要的Instruction格式>: <prerequisite格式>
<Shell命令>
这些格式则通过%来表示,如Instruction格式若是%.o,则表示生成的文件是targetName.o。这样的形式可以让target name中有多个用空格的名称分割,以并列的方式执行这些instruction。这样就可以减少很多重复行。
C语言文件编译顺序:
-s Flag —> 编译生成 .i 文件。
-c Flag —> 编译生成直到 .o 为后缀的二进制文件,但不链接每一个.o 文件
不加Flag —> 直接生成out的可执行文件
本页为草稿,可能仍不完全需进一步整理。这是个人的经验总结及分享,不含任何商业内容。转载请先获取许可,或者请使用外部链接!
Reference:
- Makefile 经典教程 https://blog.csdn.net/ruglcc/article/details/7814546
- GCC -o选项:指定输出文件 http://c.biancheng.net/view/700.html
- Makefile教程:Makefile文件编写1天入门 http://c.biancheng.net/makefile/