Makefile 101 for dummies just like me

Makefile 101 for dummies just like me

目录

##编译过程和多文件组织

###1.头文件 尖括号<>:搜索其他路径,而不搜索当前目录。
对于UNIX双引号""优先搜索本地目录

###2.作用域和链接

###3.编译过程 预编译(Preprocessing)—>编译(Compilation)—>汇编 (Assembly)—>连接(Linking)
每一个步骤生成不同的文件。1

如图2

预处理阶段:编译器根据预处理指令对源文件.c进行预处理,生成一个.i文件。
编译阶段:编译器对.i文件编译,生成汇编代码.s文件。.s文件是可以执行的
汇编阶段:汇编器对汇编代码.s文件进行汇编,生成目标文件.o文件。
连接阶段:gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。生成最终可执行程序(不加后缀)

###4.GCC GCC是GNU Compiler Collection的缩写,也就是GUN提供的一些编译器的集合。 使用$ man gcc查看全部gcc手册,可以了解GCC的详细使用方法。这里仅简单说一些比较简单的。

####(1).编译及文件生成 在上述编译过程,gcc提供一步到位的命令gcc test.c -o test 也可以分开进行

  • 生成.i文件:gcc -E test.c -o test.i
  • 生成.s文件:gcc -S test.i -o test.s
  • 生成.o文件:gcc -c test.s -o test.o
  • 生成可执行程序:gcc test.o -o test

####(2).错误和警告 GCC会在产生错误(error)的地方停止编译并给出提示,但是默认情况下并不会向IDE一样给出警告(warning),使用命令 -Wall会告诉编译器,尽可能的产生警告,以找到潜在的危险。

####(3).链接库文件 大多数情况下,linux的头文件可以在/usr/include/找到,库文件则在/usr/lib/目录下,但是有时也会放在GCC找不到的地方,比如math库。 此时我们需要用到 -L -I -llibrary三个命令。

首先我们要把文件编译成.o文件,并且由于在预编译阶段就需要头文件,我们还需要加上 -I 并在其后紧跟头文件所在目录地址,例如/usr/dev/whatever/include

gcc –c –I /usr/dev/whatever/include test.c –o test.o

然后我们需要把源文件链接。使用-L命令。

gcc –L /usr/dev/mysql/lib -llibrary test.o –o test

当然,对于使用math库,只需要加 -lm即可

###5.多文件编译:

gcc test1.c test2.c -o test相当于

gcc -c test1.c -o test1.o  
gcc -c test2.c -o test2.o  
gcc test1.o test2.o -o test   但是多次输入命令会比较繁琐,所以我们需要编写makefile,使用make来帮助我们完成。

##初步编写makefile

可以使用makefile或者Makefile,最好使用后者

makefile的规则 [^3]

target ... : prerequisites ...
     command

target:准备生成的目标文件,可以是最终的可执行文件也可以是中间文件。

prerequisites: 生成不同类型target,需要依赖的文件
1.生成可执行文件需要依赖的.o结尾的目标文件(main.o,source1.o,source2.o…)
2.生成目标文件,需要.c结尾的源文件.h结尾的头文件(source1.o需要source1.c,source1.h…)

command:make需要执行的命令。比如gcc

对于一个完整的makefile,需要重复多次该代码块,生成全部的中间文件,再用中间文件生成最后的可执行文件。

clean并不会在运行make时自动使用(伪目标),所以如果只是make的话,会生成很多中间文件。可以主动使用make clean则运行clean后面的命令,清除需要清除的文件,多数是.o文件。 如果我们想要清除所有的.o文件,可以使用*.o命令,*是一种通配符

###3.一个例子 ex : ex12-2.o ex12-pe12.o
cc -o ex ex12-2.o ex12-pe12.o ex12-2.o : ex12-2.c ex12-pe12.h cc -c ex12-2.c ex12-pe12.o : ex12-pe12.c ex12-pe12.h cc -c ex12-pe12.c clean : rm edit ex12-2.o ex12-pe12.o

[^3]:和我一起写makefile


本文采用中国大陆版CC协议发布
作者保留以下权利:

  1. 署名(Attribution):必须提到原作者。
  2. 非商业用途(Noncommercial):不得用于盈利性目的。
  3. 禁止演绎(No Derivative Works):不得修改原作品, 不得再创作。
    新浪微博 @XX含笑饮砒霜XX