预处理,编译,汇编,连接的参数如下
源文件(ma.c,ma.cc)------->-E,经过预处理(ma.i)------------>-S 经过编译(.s)--------->-c 经过汇编(.o)--------->链接成目标文件
1.预处理部分,把.c文件预处理成
gcc -E m.c
-E参数只对源文件进行预处理,不执行编译的步骤,输出被送到标准输出,如果源文件不需要预处理(例如不是.c源文件等),那么会忽略,
我们可以指定预处理生成的文件 gcc(g++) -E ma.c(ma.cc) -o ma.i,可以看到ma.i这个预处理文件,很大,很大……
2.编译,把源文件编译成.s的汇编文件
gcc -S ma.c或者ma.i -o ma.s
-S可以把.c或者.i文件编译成.s汇编文件
3.汇编,把源文件汇编成目标文件.o
gcc -c ma.c或者ma.s -o ma.o
-c这个选项是可以作编译或者汇编的,如果我们不写-o ma.o,默认也是生成ma.o的,即汇编把.c或者.s文件生成.o文件
4.链接
gcc 自己的各种.o文件 -o 生成文件
gcc会把要使用到的静态连接库和动态连接库和我们自己的.o文件一起链接生成可执行文件
关于这4个阶段,都有很多的参数进行优化
1.gcc -Wall,这个参数打开所有warning提醒,产生尽可能多的警告
2.gcc -std=指定语言标准,当前仅编译c/c++文件时才有用,好多标准,如c90,c89,gnu89(编译c默认标准 ),gnu90,iso9899:1990,c99,c9x,c1x,c++98,c++0x,gnu++98(编译c++时默认)
3.gcc -Werror,gcc会在所有产生warning的地方停止编译
4. gcc -pedantic ,-pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告
5.gcc -I DIR,把DIR增加到搜索头文件的目录中,默认头文件是放在/usr/include目录的,gcc会现搜索指定的DIR,然后在搜索标准include目录。
6.gcc -L 目录,要用到第三方的库的话,例如mysql,那么编译时会用到-lmysqlclient,那么mysqlclient.so这个库文件如果没有放到/usr/lib里面去,我们就要手动指定他的目录,这时-L 目录就是mysqlclient.so文件所在地方,完成的应该是
gcc -L /x/y/z -lmysqlclient ....