Linux系统下基于VSCode和Cmake进行C++开发

简介

在 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 常为03)
# -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的编译流程主要包括以下几个步骤:

  1. 编写CMakeLists.txt文件:在你的项目主目录中,编写CMakeLists.txt文件,这个文件描述了你的项目如何构建。包括指定最小版本号,指定项目名称,查找依赖库,添加子目录,添加头文件目录,添加预编译宏,生成可执行文件,添加链接库等。

  2. 生成Makefile:在命令行中切到你的项目目录,然后执行’cmake .'。这会让CMake读取CMakeLists.txt文件,并产生在你的系统上编译代码所需的Makefile文件。如果是在windows上,并且安装了Visual Studio,那么CMake还能生成.sln工程文件。

  3. 编译项目:使用’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怎么单步调试
    熟能生巧!保持进步!细心、耐心、坚持!

相关推荐

  1. VSCodeCMake实现C/C++开发

    2024-03-14 05:00:06       16 阅读
  2. Ubuntu采用VSCode进行C/C++开发(2)

    2024-03-14 05:00:06       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 05:00:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 05:00:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 05:00:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 05:00:06       18 阅读

热门阅读

  1. react框架中无构建模式直接使用es6组件

    2024-03-14 05:00:06       19 阅读
  2. 7. Linux进程环境

    2024-03-14 05:00:06       23 阅读
  3. npm run build小技巧

    2024-03-14 05:00:06       17 阅读
  4. 【力扣二刷思路】DAY1

    2024-03-14 05:00:06       19 阅读
  5. Uni-App通过canvas点点绘制直线,可跟随手机滑动

    2024-03-14 05:00:06       24 阅读
  6. GPT & R 生态环境领域数据统计分析

    2024-03-14 05:00:06       20 阅读
  7. uniapp实现点击图片预览放大,长按下载图片

    2024-03-14 05:00:06       18 阅读
  8. uni-app使用canvas适配手机宽高进行渲染

    2024-03-14 05:00:06       21 阅读
  9. uni-app路由

    2024-03-14 05:00:06       17 阅读
  10. 第一章 Python的基础语法

    2024-03-14 05:00:06       17 阅读
  11. 前端面试练习24.3.13

    2024-03-14 05:00:06       18 阅读
  12. Nginx如何做负载均衡

    2024-03-14 05:00:06       26 阅读