C++Vscode 中使用CMakeLists(推荐)构建C++项目:项目结构各个文件夹的作用从编码到debug

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++Vscode 中使用CMakeLists(推荐)构建C++项目:项目结构各个文件夹的作用从编码到debug相关的知识,希望对你有一定的参考价值。

Vscode建立C++项目结构及各个文件夹的作用(不使用CMakeList.txt版)_玛丽莲茼蒿的博客-CSDN博客首先要明白,vscode只是一个记事本,本身是不能够进行任何程序语言开发的。只不过这个记事本可以安装插件,可以和命令行程序结合起来使用,使得它可以进行开发。一、Vscode下C++项目的目录结构首先,类似于我们在IDEA中新建一个普通java项目,项目的目录结构是这样的:新建一个maven模板的java项目,项目的目录结构是这样的:构建一个web模板的java项目,项目的目录结构是这样的:用springboot模板构建一个java项目,项目的目录结构是这样的:对于C++.https://blog.csdn.net/qq_44886213/article/details/124194352?spm=1001.2014.3001.5501        由这篇博客可知,如果不使用CMakeLists.txt构建C++项目的话,就要编写.vscode文件夹中的三个json文件。除了麻烦外,还必须依托vscode这个平台,没法单独在shell/cmd编译。下面就要介绍一下,如何在vscode中使用CMakeLists.txt构建C++项目。

一、vscode配置

插件:

  • CMake
  • CMake tools
  • CMake Tools Helper

二、项目结构

完整的项目结构一般是这样:

给出两个真实项目的项目结构: 

包括四部分:build文件夹include文件夹src文件夹CMakeLists.txt

 其中,build、include和src文件夹已经介绍过了。下面重点介绍在vscode中使用CMakeLists.txt。

三、vscode中的CMakeLists

3.1 工作原理

        首先,我们需要知道make工具,它是一个自动化编译工具,用来批处理编译源文件,使用make工具进行编译需要编写一个规则文件Makefile,但是对于一个大工程,编写Makefile也是一件很复杂的事情。所以我们又向上抽象了一层,设计出了更为简单的CMakeLists.txt,开发人员只需要去编写简单的CMakeLists.txt,然后用cmake工具,它能够自动生成Makefile文件。然后再用make。。。。。

3.2 如何编写

        在项目的顶层目录中,建立一个CMakeLists.txt文件。以某个真实项目为例,内容如下:

cmake_minimum_required (VERSION 3.10.0)

SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENVCXXFLAGS -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENVCXXFLAGS -O3 -Wall")
#if($OpenCV_VERSION_MAJOR GREATER 3)
#        set(CMAKE_CXX_STANDARD 11)  
#endif()

# 项目名称
project(IR)

find_package(OpenCV REQUIRED)

# 头文件路径
include_directories(
    "$PROJECT_SOURCE_DIR/uvc"
  "$PROJECT_SOURCE_DIR/include"
  "$OpenCV_INCLUDE_DIRS" 
  #"/usr/include/opencv4"
  #"/usr/include/opencv4/opencv2"
  
)


link_directories(
    "/usr/lib/aarch64-linux-gnu"
    "/usr/lib"
    "$PROJECT_SOURCE_DIR/lib"
    #"$OpenCV_LIBS_DIRS"
    "/usr/lib/aarch64-linux-gnu/"
)


SET(SRC_LIST 
    "$PROJECT_SOURCE_DIR/uvc/camtrans.cpp"
    "$PROJECT_SOURCE_DIR/uvc/ircammanager.cpp"
    "$PROJECT_SOURCE_DIR/uvc/serialport.cpp"
    "$PROJECT_SOURCE_DIR/uvc/v4l2core.c"
    "$PROJECT_SOURCE_DIR/src/client_triton.cpp"
)

#------------选择编译后生成可执行文件还是动态链接库
  # add_library(
  #clienttriton SHARED
  #$SRC_LIST
  #      $<TARGET_OBJECTS:json-utils-library>
  #)
  add_executable(
  IR
   $SRC_LIST
    # $<TARGET_OBJECTS:json-utils-library>
      )

SET(LK_LIB $OpenCV_LIBS 
)

#add_executable(TritonClient $SRC_LIST)

target_link_libraries(IR $LK_LIB)
target_link_libraries(IR /lib/aarch64-linux-gnu/libpthread.so.0)



3.3 如何使用 

写好CMakeLists.txt,需要进行编译并生成可执行文件,以下是步骤,假设工程目录为work_ws/bufferevent.

首先进入build文件夹

cd work_ws/bufferevent/build

接下来生成makefile文件,..表示上一级目录,也就是CMakeLists.txt所在目录 

cmake ..

 编译makefile文件,生成可执行文件

make

 如果我们嫌每次都要删除原来生成的可执行文件,然后输入cmke..,然后再make有点繁琐,我们可以自己编写sh文件放在build文件夹下,在sh文件里输入我们要执行的相关指令。如下,是我在build文件夹下创建的make.sh文件。

#开启扩展模式匹配 否则识别不了下面的!()
shopt -s  extglob
#删除当前文件夹下除了make.sh之外的所有文件
rm -rf !(make.sh)
#生成Makefile
cmake ..
#根据Makefile生成编译生成可执行文件
make
#删除中间产生的编译文件
rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile

这样,每次我只要进入工程下的build文件夹,输入 

sh make.sh

 即可编译生成可执行文件。

PS: 不过还是推荐我们每次编写程序的时候编写一下c_cpp_properties.json,因为该文件中includePath参数可以很好指定头文件目录,这样就算没有CMakeLists.txt文件,我们在vscode编写程序的时候它也自动包含了头文件,这样就可以具有代码提示功能 。而且,有了CMakeLists.txt以后,即使写了c_cpp_properties.json文件,也并不影响项目脱离vscode单独在shell/cmd里编译运行。

上面所说的过程,编码、cmake编译以及运行都是在vscode中进行的。那么调试呢?

三、调试

为什么把debug单独拿出来说呢?因为有的时候我的编码习惯是这样的:只是把vscode当作具有代码提示功能的编辑器,然后编译和运行直接用本地的cmake在shell进行,得到可执行程序以后用gdb进行代码的调试

按照我之前的这种习惯,除了简单地下载C/C++插件以外不需要对vscode进行任何配置,因为除了打代码外,后续的过程直接不在vscode里。这是一种思路。

但是呢,如果想要在vscode里实现从编码到调试的一体化过程,还需要对vscode进行额外的配置。一步一步学CMake 之 VSCode+CMakeLists 调试 C++ 工程_芝士锅的博客-CSDN博客_cmake vscode 调试目录1. 插件推荐2. 文件准备3. 开始调试一步一步学 CMake 系列文章1. 插件推荐CMakeCMake toolsCMake Tools Helper2. 文件准备新建文件夹:TEST新建文件:CMakeLists.txt内容如下:cmake_minimum_required(VERSION 2.6)project(vscode_...https://blog.csdn.net/wanzew/article/details/83097457

 步骤

假设我们有如下的CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

。。。

add_executable(result $SRC_LIST) # 可执行文件命名为result

点击图中最左侧第四个小蜘蛛形状的图标(调试),点击左上方的小齿轮,添加配置(C++GDB/LLDB)

 这个时候资源管理器下就会生成.vscode文件夹,下面有个launch.json文件,内容如下


    "version": "0.2.0",
    "configurations": [
        
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "enter program name, for example $workspaceFolder/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "$workspaceFolder",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                
            ]
        
    ]

把下面一句:

"program": "enter program name, for example $workspaceFolder/a.out",

改成:(根据CMakeLists.txt文件内容,将会在build文件夹下生成result可执行文件)

"program": "$workspaceFolder/build/result"

然后就可以加断点调试了。

以上是关于C++Vscode 中使用CMakeLists(推荐)构建C++项目:项目结构各个文件夹的作用从编码到debug的主要内容,如果未能解决你的问题,请参考以下文章

C++那些事之高效率开发C++/C

如何将“jni/*.c/cpp”文件添加到 CMakeLists.txt 文件中?

Cmakelists以多种语言编译一组文件c ++和c [重复]

Mac+VScode配置CMake编译HelloWorld

更改 CLion 中的默认 CMakeLists.txt 以包含警告

cmake基础教程(11)add_subdirectory如何添加非子目录的CMakeLists.txt