GCC分步编译C++程序(汇总版)
通过前面几节的讲解,已经就 gcc(g++)指令可用的 -E、-S、-c 以及 -o 选项的功能和用法做了详细的讲解。在此基础上,本节将对“如何分步编译C/C++程序”这个问题做一个完整的解答。
接下来,我将以 g++ 指令分别对 C++ 源程序做预处理、编译、汇编和链接操作为例,完整地给读者演示如何分步编译源代码程序。样例程序如下:
通过给 g++ 指令添加 -S 选项,即可令 GCC 编译器仅对指定预处理文件做编译操作。例如:
例如:
完成链接操作,并不需要给 g++ 添加任何选项,只要将汇编阶段得到的 demo.o 作为参数传递给它,g++就会在其基础上完成链接操作。例如:
经过以上 4 步,最终生成了 a.out 可执行文件,我们可以尝试运行该文件,查看其结果是否正确:
除此之外,如果读者不想执行这么多条指令,但想获得预处理、编译、汇编以及链接这 4 个过程产生的中间文件,可以执行如下指令:
接下来,我将以 g++ 指令分别对 C++ 源程序做预处理、编译、汇编和链接操作为例,完整地给读者演示如何分步编译源代码程序。样例程序如下:
//位于 demo.cpp 文件中 #include <iostream> using namespace std; int main(){ cout << "GCC教程:https://www.xinbaoku.com/gcc/" << endl; return 0; }
GCC分步编译C++源程序
1) 预处理
通过给 g++ 指令添加 -E 选项,即可轻松实现令 GCC 编译器只对目标源程序进行预处理操作。比如:
[root@bogon demo]# g++ -E demo.cpp -o demo.i
[root@bogon demo]# ls
demo.cpp demo.i
感兴趣的读者可自行运行 cat demo.i 指令查看 demo.i 文件中的内容。
2) 编译
值得一提的是,编译阶段针对的将不再是 demo.cpp 源文件,而是 demo.i 预处理文件。对预处理文件进行编译操作,实际上就是对 demo.i 文件做进一步的语法分析,并生成对应的汇编代码文件(Linux 发行版通常以 ".s" 作为其后缀名)。通过给 g++ 指令添加 -S 选项,即可令 GCC 编译器仅对指定预处理文件做编译操作。例如:
[root@bogon demo]# g++ -S demo.i
[root@bogon demo]# ls
demo.cpp demo.i demo.s
3) 汇编
汇编阶段就是将之前生成的汇编代码文件(demo.s)做进一步转换,生成对应的机器指令。通过给 g++ 指令添加 -c 选项,即可令 GCC 编译器仅对指定的汇编代码文件做汇编操作。例如:
[root@bogon demo]# g++ -c demo.s
[root@bogon demo]# ls
demo.cpp demo.i demo.o demo.s
4) 链接
目标文件已经是二进制文件,与可执行文件的组织形式类似,只是有些函数和全局变量的地址还未找到,因此还无法执行。链接的作用就是找到这些目标地址,将所有的目标文件组织成一个可以执行的二进制文件。完成链接操作,并不需要给 g++ 添加任何选项,只要将汇编阶段得到的 demo.o 作为参数传递给它,g++就会在其基础上完成链接操作。例如:
[root@bogon demo]# g++ demo.o
[root@bogon demo]# ls
a.out demo.cpp demo.i demo.o demo.s
经过以上 4 步,最终生成了 a.out 可执行文件,我们可以尝试运行该文件,查看其结果是否正确:
[root@bogon demo]# ./a.out
GCC教程:https://www.xinbaoku.com/gcc/
除此之外,如果读者不想执行这么多条指令,但想获得预处理、编译、汇编以及链接这 4 个过程产生的中间文件,可以执行如下指令:
[root@bogon demo]# g++ demo.cpp -save-temps
[root@bogon demo]# ls
a.out demo.c demo.cpp demo.ii demo.o demo.s
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算