(本文为自己参考网上的资料整理所得,如果有所纰漏或者错误,请留言指明!谢谢!)
gcc可以用来编译链接.c源程序,gcc同样可以编译.cpp文件,但是不能链接.cpp文件生成可执行文件。只有g++可以编译并且链接.cpp,g++在编译.cpp文件的时候自动调用gcc进行源文件的编译。
下面来看看gcc/g++常用的参数。
一、gcc/g++常用的参数
-IDir
指定额外的头文件搜索目录,编译器首先在Dir中寻找,然后按照常规的顺序搜索头文件。
-include file
相当于在源程序中添加头文件,相当于#include "file"。
-LDir
指定编译的时候编译器搜索的库路径。
-lLIBRARY
指定编译的时候使用的库。
-E
只激活预处理功能。
-S
只激活预编译和编译功能。
-c
只激活预处理、编译和汇编功能。
-shared
生成共享目标文件,通常用于建立共享库时使用。
-static
禁止使用共享库。
-w
不生成任何警告信息。
-Wall
生成所有警告信息。
-C
在预处理的时候不删除注释信息,一般和-E联合使用,用于分析程序。
-M
生成文件的关联信息,包含目标文件生成所依赖的所有源代码。
-MM
和上面的一样,但是忽略头文件造成的依赖关系。
-MD、-MMD
对应和-M、-MM相同,只不过将输出输入到.d文件中去。
二、gcc/g++执行的四个步骤
g++命令在最后生成可执行文件之前经历了四个步骤,分别是预处理、编译、汇编和链接。我们通过使用g++的命令选项来查看g++命令执行过程中的步骤和每一步的生成文件。
(1)预处理器(预处理器cpp)
g++ -E main.cpp > main.i
上面的命令只激活预处理,该过程并不生成文件,我们采用输出重定向到main.i文件中。预处理主要是语法的检查、宏替换、注释的消除和找到相应的库文件。
(2)将预处理后的文件转换成汇编语言程序(编译器egcs)
g++ -S main.i
上面的命令执行完成后生成main.s文件,这是一个汇编语言源程序。
(3)将汇编语言源程序转换成为目标文件二进制机器码(汇编器as)
g++ -c main.i
该命令执行之后生成main.o目标文件,这就是二进制机器码。
(4)链接目标文件生成可执行程序(链接器ld)
g++ main.o
该命令执行之后便默认生成一个a.out的可执行文件,该过程是将main.o和所需的其他库文件链接生成可执行文件。
上面的四个步骤就是g++将源代码生成可执行文件经历的四个步骤。