目录
- 简介
- 一、GCC编译器
- 1.1创建cpp文件
- 1.2编译过程
- 1.3g++重要编译参数
- 二、GDB调试器
- 三、IDE-VScode
- 3.1 VSCode常用快捷键
- 3.2 swap测试
- 四、CMake
- 4.1CMake介绍
- 4.2 CMake语法特性介绍
- 4.3 CMake重要指令和常用变量
- 4.4 CMake编译流程
- 4.5CMake代码实践
- 五、使用VSCode进行完整项目开发【实战】
- 5.1 launch.json和task.json配置
- 六、总结
简介
在 Linux 系统中,使用 Visual Studio Code (VSCode) 和 CMake 进行 C++ 开发是十分方便的。以下是整个工作流的简介:
-
VSCode 是由微软出品的一款轻量级、高度可扩展的代码编辑器,它支持几乎所有的主流编程语言,可以在多种操作系统(包括 Linux)上运行。
-
CMake 是一个开源的跨平台自动化建构系统,它用于控制编译过程,使其在多个平台上能够相同。在 VSCode 中,我们使用“CMake Tools”插件来调用和使用 CMake。
-
在进行 C++ 开发时,首先在 VSCode 中创建一个新的工作区,并在其中创建源代码文件 .cpp 和你的 CMakeLists.txt 文件。CMakeLists.txt 是 CMake 的配置文件,其中定义了项目的编译和链接规则。
-
安装并配置好 CMake Tools 插件后,你可以选择 CMake Kit(对应你的编译器),并设置你的构建类型(例如 Debug 或 Release)。
-
接下来,你可以使用 VSCode 的内置终端运行 CMake 命令,这将触发 CMake 对项目的编译。在编译完成后,你可以直接在 VSCode 中运行和调试你的应用。
通过 CMake 和 VSCode,你可以轻松地在 Linux 上进行 C++ 的编写、编译、运行和调试。并且,由于 CMake 具有良好的平台兼容性,你的代码可以很容易地在其它系统(如 windows,macOS)上重新编译和运行。
这种开发方式允许你专注于代码的编写,而将复杂的编译和链接过程由 CMake 自动化处理。同时,VSCode 提供的丰富插件也可以大大提高你的开发效率。
一、GCC编译器
1.1创建cpp文件
使用vim编辑器创建一个cpp文件:
lg@lg-virtual-machine:~/cmake_class/0310$ vim test.cpp
#include<iostream>
using namespace std;
int main(){
cout<<"hh"<<endl;
return 0;
}
使用如下命令保存cpp文件并退出:
:wq
1.2编译过程
将cpp代码编译为机器语言的目标二进制代码 .o文件 ,并指定一个可执行文件的文件名:
lg@lg-virtual-machine:~/cmake_class/0310$ g++ test.cpp -o test
lg@lg-virtual-machine:~/cmake_class/0310$ ./test
hh
1.3g++重要编译参数
- -g 编译带调试信息的可执行文件
# -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。
# 产生带调试信息的可执行文件test
g++ -g test.cpp
- -O[n] 优化源代码
## 所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作
会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。
# -O 选项告诉 g++ 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2
选项告诉 g++ 产生尽可能小和尽可能快的代码。 如-O2,-O3,-On(n 常为0–3)
# -O 同时减小代码的长度和执行时间,其效果等价于-O1
# -O0 表示不做优化
# -O1 为默认优化
# -O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。
# -O3 则包括循环展开和其他一些与处理特性相关的优化工作。
# 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。
# 使用 -O2优化源代码,并输出可执行文件
g++ -O2 test.cpp
- -l 和 -L 指定库文件 | 指定库文件路径
# -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接
# 链接glog库
g++ -lglog test.cpp
# 如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在的目录名
# 链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
二、GDB调试器
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。你可以使用GDB调试各种被编译成可执行程序的语言,如C、C++、Java等。它提供了很多高级功能,例如设置断点、查看程序变量、单步执行等。
下面是一些基础的GDB命令:
- gdb program:打开你的程序
- run:运行你的程序
- break:在特定的位置设置一个断点
- step:执行下一行代码,如果下一行是一个函数调用,那么进入到这个函数中
- next:执行下一行代码,不进入函数
- print:打印变量的值
- continue:继续执行程序,直到下一个断点或者程序结束
- quit:退出GDB
为了使用GDB,在编译你的程序时,需要包含-g选项来生成额外的调试信息。
在GDB调试程序时,你可以设置断点来暂停程序的执行,观察和改变变量的值,然后继续执行,这对于查找和理解程序问题是十分有用的。
三、IDE-VScode
3.1 VSCode常用快捷键
Visual Studio Code(VSCode)是一款非常流行的开源文本编辑器,它支持多种编程语言,并且拥有许多可以提高编程效率的快捷键。这里将列举一些常用的VSCode快捷键:
- Ctrl + \:分屏显示
- Ctrl + P:快速打开文件
- Ctrl + Shift + P:显示所有命令
- Ctrl + B:隐藏或显示侧边栏
- Ctrl + Shift + E:显示资源管理器 / 切换焦点到侧边栏
- Ctrl + G:跳转到指定行数
- Ctrl + F:当前文件内搜索
- Ctrl + H:当前文件内搜索并替换
- Ctrl + D:选取单词 - 可逐个添加相同的单词进行多项选择
- Ctrl + Shift + L:选择所有出现在当前文件中的相同的词
- Alt + Up 或 Alt + Down:上移或下移一行
- Shift + Alt + Up 或 Shift + Alt + Down:向上或向下复制一行
- Ctrl + Space:代码建议(代码补全)
- F12:进入定义
- Alt + F12:显示定义预览眼睛
- Ctrl + Shift + F:全局搜寻文件内容
- Ctrl + ~:打开或关闭终端
- Ctrl + S:保存当前文件
- Ctrl + /:注释或取消注释
- Alt + Z:自动换行
- Ctrl + Shift + I:格式化文档
VSCode的快捷键可以在键盘快捷方式设置中进行自定义,快捷键有助于我们更加有效率的进行编程工作。
3.2 swap测试
首先新建一个文件夹,然后点击进入该文件夹:
在该文件夹目录下打开VSCode:
进入VSCode之后,再新建include和src两个文件夹,分别用来存放头文件和源文件,最后新建一个主函数文件main.cpp:
代码如下:
- swap.h:
#pragma once
#include <iostream>
using namespace std;
class myswap
{
public:
myswap(int a, int b);
void run();
void printInfo();
private:
int _a;
int _b;
};
- swap.cpp:
#include "swap.h"
myswap::myswap(int a, int b)
{
this->_a = a;
this->_b = b;
}
void myswap::run()
{
int temp = _a;
_a = _b;
_b = temp;
}
void myswap::printInfo()
{
cout << "a =" << _a << "b = " << _b << endl;
}
- main.cpp:
#include "swap.h"
int main(int argc, char *argv[])
{
myswap test(2, 3);
test.run();
test.printInfo();
return 0;
}
最后打开终端(Ctrl+~)编译并运行:
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ g++ main.cpp src/swap.cc -Iinclude -o main
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ ./main
a =3b = 2
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$
四、CMake
4.1CMake介绍
CMake是一种开源的、跨平台的自动化构建系统,它用来控制软件编译过程,使得源代码与目标系统的编译过程可以分离出来。
CMake可以支持目录层次和应用程序,允许开发者在一个源代码目录树中存放不同的构建配置文件。当你的源代码由很多个不同的项目组成,每个项目都有自己的构建配置时,就可以非常洁净地采用CMake来管理。
CMake可以在一个目录里存在多个独立的构建环境,每个环境都有属于自己的构建配置。有了CMake,就可以在同一个目录里同时配备Debug版和Release版的应用程序。
CMake有许多语言的扩展阅读,例如:C,C++,Fortran,Java等,使得CMake在不同的系统和不同的编译环境下,生成适应的、原生的Makefile或项目文件,如Unix的Makefile,Visual Studio的工程文件等。
CMake的语法非常简单,大部分可用的指令和变量在CMake全局帮助文档中都有所介绍。其主要配置文件命名为CMakeLists.txt,在该文件中,你可以设置项目名称、版本、相关的环境参数等。
4.2 CMake语法特性介绍
CMake的语法相对来说比较简单,主要包括以下几种结构:
- 1、设置变量:你可以使用set命令来设置一个变量,例如:
set(SOURCE_FILES main.cpp test.cpp)
这段代码定义了一个名为SOURCE_FILES的变量,它包含了两个文件:main.cpp和test.cpp。
- 2、控制流语句:CMake提供了常见的条件判断和循环语句,例如if,elseif, else, endif, while,endforeach等。
if (${VARIABLE} STREQUAL "test")
message("VARIABLE is test")
else()
message("VARIABLE is not test")
endif()
这段代码会检查VARIABLE变量是否等于"test",然后输出相应的消息。
- 3、包含和添加子目录:include和add_subdirectory命令可以用于组织你的CMakeLists.txt文件,让你的项目结构更清晰。
通过include(FileName),你可以把FileName文件里的内容插入到当前的CMake脚本文件中。
通过add_subdirectory(SubDirName),在生成构建系统的时候可以在子目录系中添加CMake的列表文件。
添加目标:使用add_executable、add_library等命令定义你的构建目标。
add_executable(MyApp main.cpp) 定义一个可执行目标,名为MyApp,源文件是main.cpp。
链接库:使用target_link_libraries命令链接库。
target_link_libraries(MyApp MyLibrary)
这段代码会让MyApp链接到MyLibrary库。
以上为CMake的基本语法,实际使用中,需要根据具体的项目需求,用更多的命令和更复杂的语句来编写你的CMakeLists.txt文件。
4.3 CMake重要指令和常用变量
CMake主要包括一下几个重要指令:
- 1、cmake_minimum_required:设置对CMake版本的最低版本要求,如果不满足该版本,报告用户错误。例如:
cmake_minimum_required(VERSION 2.8.3)
- 2、project:定义项目名称和支持的编程语言。例如:
project(HELLO C CXX)
- 3、set:设置变量的值。例如:
set(SRC_LIST main.cpp test.cpp)
- 4、message:输出消息,通常用于调试CMakeLists.txt文件。例如:
message(${SRC_LIST})
- 5、add_executable:添加需要编译的可执行文件。例如:
add_executable(myapp ${SRC_LIST})
- 6、add_library:添加库的构建命令,库源码由src2和src3命令生成。例如:
add_library(test SHARED src2.cpp src3.cpp)
- 7、target_link_libraries:为目标添加需要的链接库。例如:
target_link_libraries(myapp test)
- 8、find_package:用于加载配置文件,以便CMake使用。例如:
find_package(Qt5Core)
- 9、include_directories:添加包含目录,相当于C++中的-I选项。例如:
include_directories("/usr/include/mylib")
- 10、add_definitions:添加编译的定义,相当于C++中的-D选项。例如:
add_definitions("-DMY_DEFINE")
注意,CMake指令是不区分大小写的,你可以根据需要选择使用大写或者小写。
4.4 CMake编译流程
CMake的编译流程主要包括以下几个步骤:
-
编写CMakeLists.txt文件:在你的项目主目录中,编写CMakeLists.txt文件,这个文件描述了你的项目如何构建。包括指定最小版本号,指定项目名称,查找依赖库,添加子目录,添加头文件目录,添加预编译宏,生成可执行文件,添加链接库等。
-
生成Makefile:在命令行中切到你的项目目录,然后执行’cmake .'。这会让CMake读取CMakeLists.txt文件,并产生在你的系统上编译代码所需的Makefile文件。如果是在windows上,并且安装了Visual Studio,那么CMake还能生成.sln工程文件。
-
编译项目:使用’cmake --build .‘或’make’(Unix/Linux)或’msbuild myproject.sln’(Windows),编译上一步生成的Makefile。
这里的’.'是指当前目录,等同于源代码目录(build in source)。实际上,在项目中,我们经常会新建一个build目录,然后在这个目录下运行cmake. .和make,这会把所有编译生成的文件都放在这个子目录,而源码目录下只保存源码文件,这样可以使源码目录干净整洁。这种方式称为out of source构建。
注意:在使用cmake生成Makefile之后,如果修改了CMakeLists.txt或者添加了新的.cpp/.h文件,必须重新执行cmake一遍才会生效。
4.5CMake代码实践
查看cmake版本:
lg@lg-virtual-machine:~$ cmake --version
cmake version 3.16.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
编写CMakeLists.txt:
cmake_minimum_required(VERSION 3.16.3)
project(SWAP)
set(CMAKE_BUILD_TYPE Debug)//设置cmake构建类型为debug模式
include_directories(include)//头文件
add_executable(swapmain_cmake main.cpp src/swap.cc)//可执行的二进制文件名 , 源文件
新建一个build文件夹用来存放cmake编译产生的文件:
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ mkdir build
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ cd build/
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ cmake ..
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ make
Scanning dependencies of target swapmain_cmake
[ 33%] Building CXX object CMakeFiles/swapmain_cmake.dir/main.cpp.o
[ 66%] Building CXX object CMakeFiles/swapmain_cmake.dir/src/swap.cc.o
[100%] Linking CXX executable swapmain_cmake
[100%] Built target swapmain_cmake
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile swapmain_cmake
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ ./swapmain_cmake
a =3b = 2
五、使用VSCode进行完整项目开发【实战】
如何进行cpp项目的编译和运行在之前已经讲过,在这一章主要讲如何使用GDB调试器进行程序的debug。
5.1 launch.json和task.json配置
参考资料:VScode 调试教程 tasks.json和launch.json的设置(超详细)
launch.json和tasks.json都是Visual Studio Code编辑器的配置文件,主要用于启动和管理你项目的构建以及调试任务。配置好这两个文件之后,不需要在终端使用命令行去一步步编译和运行,比如cmake、make、./main等命令,可以直接打断点运行调试。
- launch.json:该文件是Visual Studio Code用来配置和管理调试会话的。在这个文件中,你可以定制多种启动调试程序的配置,包括调试脚本的路径,启动参数,环境变量等等。每一个对象代表一个独立的调试配置。通过这个文件,你可以实现多种调试环境的切换和管理。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/main",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "Build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
- tasks.json:该文件用于配置Visual Studio Code自动化工作流程,如编译,测试,部署等任务。用户可以通过个性化配置的方式来设定任务运行的条件,如何运行,以及运行的产出结果。
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build"
},
"tasks": [
{
"type": "shell",
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": {
"kind": "build",
"isDefault": true
},
"command": "make",
"args": [
]
},
{
"label": "Build",
"dependsOrder": "sequence", // 按列出的顺序执行任务依赖项
"dependsOn":[
"cmake",
"make"
]
}
]
}
需要一样的地方:
六、总结
在以后实际工作中,使用VSCode进行项目的开发,进行上面的步骤是比不可少的。本文,我们主要学会了以下几点:
- 1、cpp工程怎么新建?
- 2、如何使用GCC编译器和GDB调试器
- 3、如何使用CMake?
- 4、如何配置vscode怎么单步调试
熟能生巧!保持进步!细心、耐心、坚持!