专门做甜点的视频网站,百度竞价推广的技巧,天津建设工程信息网官方,一个网站一个月发多少外链比较合适通过前面几节的讲解#xff0c;已经就 gcc(g)指令可用的 -E、-S、-c 以及 -o 选项的功能和用法做了详细的讲解。在此基础上#xff0c;本节将对“如何分步编译C/C程序”这个问题做一个完整的解答。接下来#xff0c;我将以 g 指令分别对 C 源程序做预处理、编译、汇编和链接…通过前面几节的讲解已经就 gcc(g)指令可用的 -E、-S、-c 以及 -o 选项的功能和用法做了详细的讲解。在此基础上本节将对“如何分步编译C/C程序”这个问题做一个完整的解答。接下来我将以 g 指令分别对 C 源程序做预处理、编译、汇编和链接操作为例完整地给读者演示如何分步编译源代码程序。样例程序如下//位于 demo.cpp 文件中#include using namespace std;int main(){cout GCC教程http://c.biancheng.net/gcc/ endl;return 0;}GCC分步编译C源程序1) 预处理通过给 g 指令添加 -E 选项即可轻松实现令 GCC 编译器只对目标源程序进行预处理操作。比如[rootbogon demo]# g -E demo.cpp -o demo.i[rootbogon demo]# lsdemo.cpp demo.i注意由于编译阶段需要用到预处理的结果因此这里必须使用 -o 选项将该结果输出到指定的 demo.i 文件中(Linux 系统中通常用 .i 或者 .ii 作为 C 程序预处理后所得文件的后缀名)。感兴趣的读者可自行运行 cat demo.i 指令查看 demo.i 文件中的内容。2) 编译值得一提的是编译阶段针对的将不再是 demo.cpp 源文件而是 demo.i 预处理文件。对预处理文件进行编译操作实际上就是对 demo.i 文件做进一步的语法分析并生成对应的汇编代码文件(Linux 发行版通常以 .s 作为其后缀名)。通过给 g 指令添加 -S 选项即可令 GCC 编译器仅对指定预处理文件做编译操作。例如[rootbogon demo]# g -S demo.i[rootbogon demo]# lsdemo.cpp demo.i demo.s和预处理阶段不同即便这里不使用 -o 选项编译结果也会输出到和预处理文件同名(后缀名改为 .s)的新建文件中。3) 汇编汇编阶段就是将之前生成的汇编代码文件(demo.s)做进一步转换生成对应的机器指令。通过给 g 指令添加 -c 选项即可令 GCC 编译器仅对指定的汇编代码文件做汇编操作。例如[rootbogon demo]# g -c demo.s[rootbogon demo]# lsdemo.cpp demo.i demo.o demo.s显然默认情况下汇编操作会自动生成一个和汇编代码文件名称相同、后缀名为 .o 的二进制文件(又称为目标文件)。4) 链接目标文件已经是二进制文件与可执行文件的组织形式类似只是有些函数和全局变量的地址还未找到因此还无法执行。链接的作用就是找到这些目标地址将所有的目标文件组织成一个可以执行的二进制文件。完成链接操作并不需要给 g 添加任何选项只要将汇编阶段得到的 demo.o 作为参数传递给它g就会在其基础上完成链接操作。例如[rootbogon demo]# g demo.o[rootbogon demo]# lsa.out demo.cpp demo.i demo.o demo.s在链接阶段如果不使用 -o 选项将执行结果输出到指定文件则 g 会默认创建一个名为 a.out 的可执行文件并将执行结果输出到该文件中。经过以上 4 步最终生成了 a.out 可执行文件我们可以尝试运行该文件查看其结果是否正确[rootbogon demo]# ./a.outGCC教程http://c.biancheng.net/gcc/显然该结果和我们的预期相符。除此之外如果读者不想执行这么多条指令但想获得预处理、编译、汇编以及链接这 4 个过程产生的中间文件可以执行如下指令[rootbogon demo]# g demo.cpp -save-temps[rootbogon demo]# lsa.out demo.c demo.cpp demo.ii demo.o demo.s可以看到通过给 g 添加 -save-temps 选项可以使 GCC 编译器保留编译源文件过程中产生的所有中间文件。