IE盒子

搜索
查看: 90|回复: 0

自用VS Code C++环境配置与CMake最简指南与模板

[复制链接]

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-4-19 13:49:28 | 显示全部楼层 |阅读模式
本文包含以下内容


  • Linux下在VS Code构建C++开发环境(智能提示与跳转, DEBUG环境等)
  • 个人用CMake模板与所需最简的语法
前言

刚学C++那会儿, 项目构建给我难倒了
C++的项目构建工具, 我本科时, 最早用的是make, make最基本的就是目标, 命令与依赖三个选项嘛, 看起来简单易懂. 但make个人写起来感觉和写脚本一模一样. 有次有个项目晾着一两星期, 我就看不懂自己写过的Makefile了, 后面我就转向CMake了. 虽然CMake这位更是一言难尽...... 但无奈它先是占据了市场, 现代的构建工具也只能用它.
C++环境构建(不依赖CMake)

卸载原有VS Code C++ Extension插件

(估计没啥用的小tips: WSL2下, 如果docker容器本来使用C++插件进行智能提示, 在WSL2下安装clangd后, 可能导致容器下的插件不起作用)


环境工具安装

在Linux终端中安装clangd lldb
sudo apt install clangd lldb在VS Code中安装clangd和CodeLLDB插件


clangd代码检查依赖一个compile_command.json的文件, 这个文件可以使用cmake来生成, 而如果你的项目使用的是make构建的话, 也有bear来进行生成, 接下来分别将介绍这两种方法.
还有提醒一点就是clangd虽然名字有clang, 但同样支持gcc编译的项目, 甚至是交叉编译的项目(我曾将clangd使用在risc-v上, 体验良好)
使用CMake生成compile_command.json

CMake在指定构建目录的命令中加入以下选项就可以生成compile_command.json (如果你不熟悉CMake, 后文会介绍个人使用的最简CMake项目模板与使用指南)
cmake -B build  -DCMAKE_EXPORT_COMPILE_COMMANDS=1使用bear生成compile_command.json

先安装bear
sudo apt install bear使用如下, 在bear命令后加上你原来准备使用的make命令即可在当前目录下看到compile_command.json
make clean && bear make all为clangd指定compile_command.json所在路径

在VS Code右下角打开Settings


搜索clangd, 在Clangd: Arguments指定compile_command.json路径, 由cmake创建的会在构建目录下, 由bear创建的会在当前目录下.


总之, clangd就开始进行工作了.
DEBUG配置

在.vscode文件夹下的launch.json文件是VS Code的debug配置文件, 只要在program栏里写下你的可执行目标文件就可以了, 然后按F5就可以打断点开始调试了.
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "Debug",
      "program": "${workspaceFolder}/build/proj/proj",
      "args": [],
      "cwd": "${workspaceFolder}"
    }
  ]
}CMake最简指南与个人用模板

(碎碎念: CMake和C++这俩真是卧龙凤雏......但问题是作为一个项目管理工具, 大部分人花太多时间在CMake上完全不值当. 个人经验教训让我觉得CMake入门只需要懂几个Modern CMake最基本的命令和规则, 然后拿个最简单的项目模板抄抄改改就行了, 真要看大项目的CMakeLists.txt再去细看, 不要像我一样误入弯路)
首先安装cmake
sudo apt install cmake在VS Code上可以安装个插件作语法高亮, 下面的CMake Tools应该是封装了CMake的一些操作, 想要也可以安装, 但我自己是不用的


cmake会根据当前目录下的CMakeLists.txt的内容来执行构建命令
可以看下示例模板的目录结构, 根目录和子目录proj下各有一个CMakeLists.txt文件, proj目录存放着当前的实际项目, 这种项目结构的好处是之后还可以在根目录下添加与proj平级的项目, proj0, proj1, proj2等等, 方便拓展.


根目录下的CMakeLists.txt如下, 接下来将按行逐条解释
cmake_minimum_required(VERSION 3.16)
set(CMAKE_BUILD_TYPE Debug)
#set(CMAKE_C_COMPILER "/usr/bin/clang")
#set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

project(proj LANGUAGES CXX)

add_subdirectory(proj)cmake_minimum_required(VERSION3.16) 这一个命令指示编译该项目所需的cmake最小版本号, 你可以使用cmake --version查看当前的cmake版本号, 直接然后照抄就是了.
set(CMAKE_BUILD_TYPE Debug) 这一条命令用于设置项目要不要附带Debug信息进行编译, 设置成Release可以不附带Debug信息进行编译
set(CMAKE_C_COMPILER"/usr/bin/clang") 为CMake设置C编译器clang, 没安装clang可以不写
set(CMAKE_CXX_COMPILER"/usr/bin/clang++") 为CMake设置C++编译器clang++, 没安装clang可以不写
set(CMAKE_CXX_STANDARD 11) 这个命令很明显了, 设置C++的版本, 这里设置为11, 可以选择你喜欢的
set(CMAKE_CXX_STANDARD_REQUIRED ON) 常与上一条命令搭配的命令, 让cmake检查编译器是否符合要求
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 这个命令是指示cmake导出compile_command.json文件, 还记得吗, 就上文说的用于指导clangd进行智能提示的文件, 你要是不需要也可以去掉该语句或者设置为OFF
project(proj LANGUAGES CXX) 必选命令, 指定当前项目名, LANGUAGES后指示该项目使用什么编程语言(注意是复数LANGUAGES而不是LANGUAGE), CXX代表C++
add_subdirectory(proj) 指示proj目录下还有一个文件夹需要cmake进行处理(注意, 这里的proj与上一条project()命令的proj无关系)
接着看向proj目录下的CMakeLists.txt, 这里很简单, 只有两条有效命令, 还有两条被注释了的链接命令随后便讲.
file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cc include/*.h)

# find_package(Eigen3 3.3 REQUIRED NO_MODULE)

add_executable(proj ${srcs})

# target_link_libraries(proj PUBLIC Eigen3::Eigen)file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/.cc include/.h) file命令是将指定的文件添加到变量中, 这里指定了src目录下的以cc结尾的文件, 和include目录下以.h结尾的文件. (注意, cmake查找相对路径是当前CMakeLists.txt所在的路径) GLOB_RECURSE则是指定递归地寻找, 也就是不仅会搜索src目录下以cc结尾的文件, src下的任何一级子目录下的cc文件都会被加入srcs变量, include/*.h也是同理. 设置CONFIGURE_DEPENDS则会在目录下有新文件加入时, 更新变量.
add_executable(proj ${srcs}) add_executable这条命令新增了一个名为proj(与之前出现的proj无关)的target, 这个target是一个可执行(executable)文件, 它的编译依赖于之前设置的srcs变量.
接下来两条命令则是展示了如何链接库文件, 不需要可以注释掉, 这里使用了Eigen做示范, 如果你的电脑还未安装eigen库, 可以运行sudo apt install libeigen3-dev安装eigen
find_package(Eigen3 3.3 REQUIRED NO_MODULE) find_package命令用于加载外部依赖库, Eigen3 3.3制定了依赖库名和版本好, REQUIRED指明必须找到该库, 否则报错, NO_MODULE则是让CMake使用配置模式进行查找, 默认情况下, CMake在/usr/lib/cmake搜索依赖库对应的*Config.cmake文件, 用它来配置链接库选项, 我在安装Eigen库后, 它就将cmake的配置文件也安装到对应目录里了, 因此这里可以使用find_package找到Eigen
target_link_libraries(proj Eigen3::Eigen) 这条命令是非常重要的, 它指示了将eigen库链接到了之前设置的target proj上, 需要注意的是, 这里不用设置proj需要include的目录, 将target链接到库的时候, Eigen需要对外可见的头文件也被设置在target的include目录下了
(除了CMakeLists.txt之外, 注意proj下的include目录下还有一个同名的proj目录, 这样做的唯一好处是可以用#include<proj/head.h>, 在创建了和proj同级的target, 例如proj0, proj1, proj2时, 可以更好地区分include了哪个目录下的头文件)
CMake常用的命令行命令

该命令会寻找当前目录下的根CMakeLists.txt, 并创建配置好一个build文件夹, 接下来cmake所有的改动都会在build文件夹下进行, 不污染原项目环境 (这就是所谓的out of tree?)
cmake -B build 还记得之前让cmake生成compile_command.json的命令吗, 如果在CMakeLists.txt里没有写上, 也可以在这一步写好.
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=1然后就是让cmake进行真正构建的命令了, 用过make的应该都熟悉, -j20是让make使用20个线程进行构建的选项, 这里的-j20, cmake会将它传给真正的构建工具make, 让make使用-j20选项
cmake --build build -j20其它

给真真新人的建议: 创建命令很烦的吧, 我又不想去学, 去配置cmake tools插件的用法, 而且这插件又冗余也不能在shell里用, 那怎么办呢, 在~/.bashrc(我用的zsh, 那应该是.zshrc)里创建快捷命令.
我在~/atools下备份了一份模板, 然后在.zshrc(.bashrc)里设置快捷命令,
source ~/.proxy.sh set
c7(){
  cp -r /home/foo/atools/cmake_template/* .
  mv ./aavscode ./.vscode
}
c8(){
   mkdir $1 && cp -r /home/foo/atools/cmake_template/* ./$1
   mv ./$1/aavscode ./$1/.vscode
}
alias c0="cmake -B build"
alias c1="cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=1"
alias c2="cmake --build build -j20"
alias c3="r0 && c1 && c2"
alias c4="./build/main/main"
alias r0="rm -rf ./build"c7在当前目录下创建项目, 而c8 proj_name命令就能在当前目录下, 复制一个简单的cmake项目.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表