目录
##编译过程和多文件组织
###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协议发布
作者保留以下权利:
- 署名(Attribution):必须提到原作者。
- 非商业用途(Noncommercial):不得用于盈利性目的。
- 禁止演绎(No Derivative Works):不得修改原作品, 不得再创作。
新浪微博 @XX含笑饮砒霜XX