ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

用g++命令执行C++多文件项目

2022-07-12 17:03:31  阅读:140  来源: 互联网

标签:文件 执行 ++ C++ student main root


在不同的系统平台上,执行 C++ 程序的常用方式也有所不同

  • 比如说在 Windows 平台上,我们经常使用 Visual Studio、dev C++、codeblocks 这些 IDE 执行 C++ 程序;
  • 而在 Linux 平台上,虽然也有很多可用的 C++ IDE,但执行 C++ 程序更常采用的方式是使用 g++ 命令

除此之外,Linux 平台上还经常编写 makefile 来运行规模较大的 C++ 项目。关于 makefile,读者可阅读《Makefile教程:Makefile文件编写1天入门》专题做详细了解。

本节将在 CentOS 系统下(Linux 发行版之一),为读者演示如何使用 g++ 命令执行 C++ 程序

安装g++编译器

值得一提的是,CentOS 系统并没有默认安装 g++ 编译器,需要我们自行安装。读者也可以使用如下命令验证当前环境中是否已经安装有 g++。

打开 Terminal 终端并执行如下命令:

[root@bogon ~]# which g++
/usr/bin/g++

可以看到,我所使用的系统环境中,已经安装好了 g++,其位于 /user/bin/g++ 目录中。如果读者所使用的系统环境中也已安装好了 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

其中,-E 选项用于限定 g++ 编译器只进行预处理而不进行后续的 3 个阶段;-o 选项用于指定生成文件的名称。Linux 系统中,通常用 ".i" 作为 C++ 程序预处理后所得文件的后缀名。

感兴趣的读者可自行运行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

其中,-S 选项用于限定 g++ 编译器对指定文件进行编译,得到的汇编代码文件通常以“.s”作为后缀名。感兴趣的读者可以使用 cat 命令查看生成文件的内容。

3) 经历汇编阶段,即将汇编代码文件转换成可以执行的机器指令。继续执行如下命令:

[root@bogon ~]# g++ -c main.s -o main.o
[root@bogon ~]# g++ -c student.s -o student.o

-c 指令用于限定 g++ 编译器只进行汇编操作,最终生成的目标文件(本质就是二进制文件,但还无法执行)通常以“.o”作为后缀名。

4) 经历链接阶段,即将所有的目标文件组织成一个可以执行的二进制文件。执行如下命令:

[root@bogon ~]# g++ main.o student.o -o student.exe

注意,如果不用 -o 指定可执行文件的名称,默认情况下会生成 a.out 可执行文件。Linux 系统并不以文件的扩展名开分区文件类型,所以 a.out 和 student.exe 都是可执行文件,只是文件名称有区别罢了。

以上 4 个阶段中,文件的生成不分先后,只要保证所有源文件都得到处理即可。

经历以上 4 步,最终会生成 student.exe 可执行文件,其执行结果为:

[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++,student,main,root
来源: https://www.cnblogs.com/zjuhaohaoxuexi/p/16470719.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有