一 GCC编译流程
1.预处理阶段
gcc -E hello.c -o hello.i
说明:(1)-o <输出文件> :指定输出文件
(2)-E 只执行编译预处理
该阶段是读取头文件的内容,并把相应的内容插入到源代码,预处理结束后停止编译过程。
cat hello.i|less 查看
2.编译阶段
gcc -S hello.i -o hello.s
cat hello.s
说明:(1) -S 将代码转换为汇编
该阶段首先检查代码的规范性,是否有语法错误,检查无误后,将其翻译为汇编代码。
3.汇编阶段
gcc -c hello.s -o hello.o
说明:(1)-c 只进行编译操作,不进行链接操作
该阶段汇编器将汇编代码编译成机器语言指令。
4.链接阶段
gcc hello.o -o hello1
ls -l hello1
file hello1
说明:GCC在编译时默认使用动态库。动态库在链接时并没有把库文件的代码加入到可执行文件,而是在程序执行时由运行时链接文件加载库。
gcc -static hello.o -o hello2
ls -l hello2
file hello2
说明:静态链接,把库文件的代码全部加载到可执行文件,因此生成的文件比较大。
5.gcc其它指令形式
(1) gcc -Wall hello.c
说明:1)编译源代码文件生成对象文件(.o),链接对象文件得到可执行文件,删除对象文件。采用默认的文件名:a.out。
2)显示警告信息
gcc -Wall hello.c -o hello
说明:指定可执行文件名为hello。
(2)gcc -c -Wall a.c b.c c.c d.c
说明:将多个源文件生成对应的对象文件。
(3)多个源文件生成可执行文件
gcc -Wall hellomain.c sayhello.c -o hello
说明:hellomain.c调用sayhello.c,该命令将两个文件分别编译为对象文件且将其链接为可执行文件hello,并删除对象文件。
(4)链接gcc非默认库函数
在编译的时候要加入“-l库的首字母”来进行编译。
进一步说明:编译程序时,得到undefined reference to 'XXXX'的错误提示。
那一定时缺少某个库,用-l参数将库加入。Linux的库命名是一致的,一般为libxxx.so, libxxx.a, libxxx.la, 那么链接某个库就用-lxxx, 去掉头lib和后缀。
gcc hello.c -lm -o hello
程序中用到math.h,该文件不是gcc默认的头文件。