VSCode配合CMake进行项目开发的过程:
VSCode安装三个插件(其他插件按需加载,不是必须):
C/C++ CMake CMake Tools
1 设置项目目录
头文件一般放在include
文件夹中,源文件一般放在src
文件夹中
tree . # 查看文件目录
.
├── include
│ ├── 1.h
│ └── 2.h
├── main.cpp
└── src
├── 1.cpp
└── 2.cpp
2 编写CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(PROJECT NAME)
# include_directories(include) 和下面效果相同 相对路径
include_directories(${CMAKE_SOURCE_DIR}/include)
# 不会覆盖CMAKE_CXX_FLAGS选项 在后面追加选项-g(等同于Debug选项) -O2
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
# 生成compile_commands.json文件
# set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
#debug模式 可以进行调试
set(CMAKE_BUILD_TYPE Debug)
add_executable(myexe main.cpp src/1.cpp src/2.cpp)
另一种写法:(多目录示例)
.
├── include
│ ├── 1.h
│ └── 2.h
├── main.cpp
└── src
├── 1.cpp
└── 2.cpp
src
文件夹中中写一个CMakeLists.txt
#将当前文件夹下的源文件全部定义为 SRC变量
aux_source_directory(. SRC)
#通过变量生成共享动态库
add_library(src SHARED ${SRC})
主目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(SOLIDFIRE)
include_directories(include)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
set(CMAKE_BUILD_TYPE Debug)
#添加子目录 此时子目录中一定要有一个CMakeLists.txt
add_subdirectory(src)
#将当前文件夹下的源文件全部定义为 SRC变量
aux_source_directory(. SRC)
#通过变量构建可执行文件
add_executable(main ${SRC})
#链接共享库(子目录中生成的共享库) 这一命令不能和上一命令调换顺序 否则会报错找不到可执行文件
target_link_libraries(main src)
CMake
重要指令
cmake_minimum_required(VERSION 2.8.3)
project(HELLOWORLD)
#set - 显式的定义变量 定义SRC变量,其值为sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)
#include_directories - 向工程添加多个特定的头文件搜索路径 相对路径与绝对路径均可以
include_directories(/usr/include/myincludefolder ./include)
#link_directories - 向工程添加多个特定的库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)
#add_library - 生成库文件 通过变量 SRC(上面定义过的变量) 生成 libhello.so 共享库 [SHARED|STATIC|MODULE]
add_library(hello SHARED ${SRC})
#add_compile_options - 添加编译参数
obing
# 添加编译参数 -Wall -std=c++11 -O2
add_compile_options(-Wall -std=c++11 -O2)
#add_executable - 生成可执行文件
# 编译main.cpp生成可执行文件main
add_executable(main main.cpp)
#target_link_libraries - 为 target 添加需要链接的共享库
# 将hello动态库文件链接到可执行文件main
target_link_libraries(main hello)
#add_subdirectory - 向当前工程添加存放源文件的子目录
# 添加src子目录,src中需有一个CMakeLists.txt
add_subdirectory(src)
#aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
# 定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
# 编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC})
CMake
常用变量:
#CMAKE_CXX_FLAGS g++编译选项
# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#CMAKE_BUILD_TYPE 编译类型(Debug, Release)
# 设定编译类型为debug,调试时需要选择debug
set(CMAKE_BUILD_TYPE Debug)
# 设定编译类型为release,发布时需要选择release
set(CMAKE_BUILD_TYPE Release)
3外部编译 手动构建CMake
项目
mkdir build
cd build
cmake ..
make
在build
文件夹中生成可执行文件myexe
.
4配置launch.json
项目并调试
VSCode
底层是采用g++
和GDB
调试器进行调试的
点击运行和调试按钮,选择环境C++(GDB/LLDB)
,g++
生成和调试文件,生成launch.json
文件,修改:
// 可执行文件路径
"program": "${workspaceFolder}/build/myexe",
// 项目路径
"cwd": "${workspaceFolder}",
在程序上打断点,即可按F5
进行调试.
此时需要注意的是:需要修改launch.json
文件,另外CMakeLists.txt
中一定要添加Debug
模式,才可进行调试.
5 自动编译并调试 配置tasks.json
文件
如果.vscode
文件夹中没有的话,可以在选项栏选择终端->配置默认生成任务中添加.(随便选择一个就好)
// 自动化命令
// cd 当前工程目录/build cmake .. make
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build"
},
"tasks": [
{
"type": "shell",
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": "build",
"command": "make",
"args": [],
"problemMatcher": []
},
{
"label": "Build",
"dependsOrder": "sequence",
"dependsOn": [
"cmake",
"make"
],
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
],
}
另外再修改launch.json
中的
# 这里的意思就是在运行launch.json之前先执行Build命令
"preLaunchTask": "Build",
此时如果把build
文件夹下的所有文件(包括已生成的可执行文件)全部删除,可以打断点再次F5
调试,可以看到自动就会执行CMake
编译操作,生成了可执行文件.