写这篇博客主要目的是记录以下几个知识点,接下来一个接一个介绍其概念与用法。
1,认识并使用vscode
2,使用g++编译运行一个多文件C++工程
3,使用cmake编译一个多文件C++工程
4,在vscode上面编译运行/调试一个多文件C++工程
5,不用vscode直接使用gdb调试一个多文件C++工程
6,在vscode上直接调试一个C++工程与在vscode上使用gdb调试一个C++工程相结合
文章目录
1,认识并使用vscode
1)vscod下载,可以进官网下载,但是比较慢,也可以直接从我的百度网盘下载,比较快VSCodeUserSetup-x64-1.54.2,提取码:6666
2)将vscode远程连接阿里云linux服务器,或者个人的linux虚拟机,远程连接方法与连接过程中遇到的错误在都记录在我的这篇博客中:
玩转linux时遇到的问题(同步更新)
3)远程连接好linux以后,在linux上编写一个简单的C++程序。(注意在这之前先在远程linux上安装好g++,gcc,gdb,cmake
vscode简单使用.mp4;提取码:6666
这里只是介绍了工程中只有单文件(只有一个cpp文件)时,怎么编译运行的问题,后面如果我们的一个工程比较大,可能头文件,源文件都在不同的文件夹中,构成一个项目。这个项目的编译运行就需要格外注意了:
1)在终端直接编译运行,需要熟悉g++怎么编译运行一个多文件C++工程的方法。
2)在vscode界面直接编译运行,需要熟悉怎么配置两个json文件,launch.json,tasks.json;这些东西在后文都会讲到。
2,使用g++编译运行一个多文件C++工程
2.1 编译过程
在前面视频的介绍中,我们可以看到直接用g++ hello.cpp -o hello
实际上这条编译语句是一次性将hello.cpp编译为一个可执行文件hello,完整的步骤应该有四步——预处理,编译,汇编,链接。读者可以选择处理完这四步将程序编译为可执行文件,也可以像前面一样直接g++ hello.cpp -o hello
这里先介绍以下这四步是如何处理的。
1,预处理——.cpp文件–>.i文件
//将输入的.cpp文件预处理成.i文件
//注意-o选项后面接生成的文件名
g++ -E hello.cpp -o hello.i
//读者可以在linux终端使用cat语句查看hello.i文件
2,编译——.i文件–>.s文件
//将.i文件编译为汇编代码文件.s
g++ -S hello.cpp -o hello.s
3,汇编——.s文件–>.o文件
//将.s汇编文件再次编译为机器代码文件.o文件
g++ -c hello.s -o hello.o
4,链接——.o文件–>bin文件
//将.o机器代码文件链接起来(如果有多个cpp文件就需要链接)
g++ hello.o -o hello
2.2 编译过程中的一些重要参数
(重要看第4条,介绍了如何编译多文件C++工程)
1,-g
-g选项告诉GCC产生能被GNU调试器GDB使用的调试信息,以调试程序。产生带调试信息的可执行文件g++ -g hello.cpp -o hello
,注意到这个-g选项加在了g++后面,其实这个参数的位置放哪里都无所谓,也可以这样g++ hello.cpp -o hello -g
,下面要讲的其他的参数的位置也是同样无所谓的。
2,-O
,优化源代码
所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作
-01为默认优化
-02除了完成-01的优化之外,还进行一些额外的调整工作,如指令调整等。g++ -O2 hello.cpp -o hello
-03则包括循环展开和其他一些与处理特性相关的优化工作。
3,-l或者-L
,指定库文件|指定库文件路径
-l(小写)指定程序要链接的库,然后不用带空格直接写要连接的库名(在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接,不用后面的-L参数指定库文件所在目录)
-L参数跟着就是库文件所在的目录名。
例如:
1)g++ -lglog hello.cpp -o hello
链接glog库
2)g++ -L/home/dir1/test -ltest hello.cpp -o hello
链接
/home/dir1/test -ltest目录下的test库
4,-I
系统里的inlude头文件一般是不用指定的,gcc知道去哪里找,但是如果不是系统头文件的话,就需要指定include文件所在目录。
例如我们的某一个C++项目的文件结构如下:
可以看到要编译这个工程需要编译两个cpp文件,而且还要注意到有一个头文件在当前项目的根目录下的include目录下,因此编译这个工程的的语句为g++ -Iinclude main.cpp add.cpp -o main
这也是我们使用g++编译一般多文件C++工程的方法。
5,-Wall
打印警告信息
6,-w
关闭警告信息
7,-std==C++11
使用C++11标准编译
8,-o
指定输出文件名
9,-D
定义宏,例如-DDebug
定义Debug
宏,可能文件中有Debug宏部分的相关信息,用个Gebug来选择开启或关闭Debug
示例代码:
// -Dname 定义宏name, ,默认定 义内容为字符串“1”
#include <stdio.h>
int main( )
{
#ifdef DEBUG
printf