用g++命令执行C++多文件项目
本节将在 CentOS 系统下(Linux 发行版之一),为读者演示如何使用 g++ 命令执行 C++ 程序。除此之外,Linux 平台上还经常编写 makefile 来运行规模较大的 C++ 项目。关于 makefile,读者可阅读《Makefile教程:Makefile文件编写1天入门》专题做详细了解。
安装g++编译器
值得一提的是,CentOS 系统并没有默认安装 g++ 编译器,需要我们自行安装。读者也可以使用如下命令验证当前环境中是否已经安装有 g++。打开 Terminal 终端并执行如下命令:
[root@bogon ~]# which g++
/usr/bin/g++
对于尚未安装 g++ 编译器的读者,可直接在终端中执行如下命令:
yum install gcc-c++
注意,该命令执行时可能会提示“你需要以 root 权限执行此命令”,这种情况下可以输入su
命令,然后输入 root 用户的登陆密码,再次执行安装指令即可成功安装。g++命令执行C++项目
《那些被编译器隐藏了的过程》一节中讲到,C 或者 C++ 程序的执行过程分为 4 步,依次是预处理、编译、汇编和链接。我们知道,C++ 多文件编程中有头文件(.h 为后缀)和源文件(.cpp为后缀)之分。需要注意的是,在执行 C++ 项目时,头文件是不需要经历以上这 4 个阶段的,只有项目中的所有源文件才必须经历这 4 个阶段。
假设有这样一个 C++ 项目:
//student.h class Student { public: const char *name; int age; float score; void say(); }; //student.cpp #include <iostream> //std::cout、std::endl #include "student.h" //Student void Student::say() { std::cout << name << "的年龄是" << age << ",成绩是" << score << std::endl; } //main.cpp #include "student.h" //Student int main() { Student *pStu = new Student; pStu->name = "小明"; pStu->age = 15; pStu->score = 92.5f; pStu->say(); delete pStu; //删除对象 return 0; }该项目正确的执行结果为:
小明的年龄是15,成绩是92.5
可以看到,当前项目中有 1 个 student.h 头文件,student.cpp 和 main.cpp 2 个源文件。接下来就用 g++ 命令执行此项目,其过程依次是:
1) 经历预处理阶段,执行如下命令:
[root@bogon ~]# g++ -E main.cpp -o main.i
[root@bogon ~]# g++ -E student.cpp -o student.i
感兴趣的读者可自行运行
cat main.i
指令查看 main.i 文件中的内容(student.i文件也可以用此方式查看)。
2) 经历编译阶段,即对预处理阶段得到的 -i 文件做进一步的语法分析,生成相应的汇编代码文件。继续执行如下命令:
[root@bogon ~]# g++ -S main.i -o main.s
[root@bogon ~]# g++ -S student.i -o student.s
3) 经历汇编阶段,即将汇编代码文件转换成可以执行的机器指令。继续执行如下命令:
[root@bogon ~]# g++ -c main.s -o main.o
[root@bogon ~]# g++ -c student.s -o student.o
4) 经历链接阶段,即将所有的目标文件组织成一个可以执行的二进制文件。执行如下命令:
[root@bogon ~]# g++ main.o student.o -o student.exe
注意,如果不用 -o 指定可执行文件的名称,默认情况下会生成 a.out 可执行文件。Linux 系统并不以文件的扩展名开分区文件类型,所以 a.out 和 student.exe 都是可执行文件,只是文件名称有区别罢了。经历以上 4 步,最终会生成 student.exe 可执行文件,其执行结果为:以上 4 个阶段中,文件的生成不分先后,只要保证所有源文件都得到处理即可。
[root@bogon ~]# ./student.exe
小明的年龄是15,成绩是92.5
注意“./”表示当前目录,不能省略。
读者可能觉得整个执行过程非常繁琐,直接执行如下命令即可生成最终的可执行文件:
[root@bogon ~]# g++ main.cpp student.cpp -o student.exe
[root@bogon ~]# ./student.exe
小明的年龄是15,成绩是92.5
强烈建议初学者学会使用前一种“繁琐”的执行方式,因为它有利于你更深入地了解 C++ 程序的执行过程。
所有教程
- 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
- 大数据
- 云计算