C语言 Make

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:

  1. Makefile 经典教程 https://blog.csdn.net/ruglcc/article/details/7814546
  2. GCC -o选项:指定输出文件 http://c.biancheng.net/view/700.html
  3. Makefile教程:Makefile文件编写1天入门 http://c.biancheng.net/makefile/
Scroll to Top