- gcc编译4步骤
a. 预处理
生成预编译文件:
gcc -E hello.c -o heelo.i
b. 编译
生成汇编代码
gcc -S hello.i -o hello.s
c. 汇编
生成目标文件
gcc -c hello.s -o hello.o
d. 链接
生成可执行文件
gcc hello.o -o hello - 其它常用选项介绍
-I:指定头文件所在目录位置
hello.c包含的头文件hello.h放在了和hello.c同一级目录下的inc文件夹内,hello.c的代码如下,那么在编译时需要通过-I指定头文件hello.h的路径。
#include "hello.h"
int main(int argc, char *argv[])
{
int a=10;
printf("Hello Linux\n");
#ifdef HELLO
printf("This is a debugging message\n");
#endif
while(0)
{
printf("This is an error message\n");
}
return 0;
}
指令如下:
gcc -I./inc hello.c -o hello
-g:编译时添加调试文件。主要支持gdb调试
增加-g选项编译的文件可以使用gdb工具进行调试。指令如下:
gcc -I./inc hello.c -o hello.dbg -g
-On: n=0~3 编译优化,n越大优化得越多
当使用O时可以优化掉上述代码中while(0)部分。在某些特殊情况下不能使用-O选项,特别是在嵌入式使用的过程中,比如
int i = 0;
i = 1;
i = 0;
i = 1;
i =0;
i = 1;
i = 0;
在上述代码中使用-O3选项是会优化掉i中间的变化部分,直接就是i=0;如果在嵌入式系统中i表示一个IO,外接了一个指示灯,不优化的状态是“灭-亮-灭-亮-灭-亮-灭”,优化后直接就是灭了。
-Wall: 显示所有编译警告信息
当使用这个选项编译上述代码时,会出现如下警告信息:
#gcc -I./inc hello.c -o hello -Wall
hello.c:在函数'main'中:
hello.c:5:警告:未使用的变量‘a’
-D:向程序中动态注册宏定义。
例如定义HELLO编译上述程序,然后执行会有如下结果:
#gcc -I./inc hello.c -o hello -D HELLO
#./hello
Hello Linux
This is a debugging message
不定义HELLO则不会输出“This is a debugging message”。