我的同事@ 在Linux上是纯记事本开发C++的,在下也是佩服的五体投地。
我还是太嫩了,还是需要一些不错的工具的,很多人推荐CLion,but,我穷且假正经。。。
所以研究以下VSCode吧,简单入了个门,记录一下。
1、VSCode+gcc
对于单个文件,在VScode中点击调试->创建launch.json->选择(GDB/LLDB)->g++
到此,对于单文件简单项目可以直接跑起来,并且直接进入调试的。
以上的操作,会在项目中生成.vscode文件夹,里面会生成两个文件:launch.json和tasks.json
launch.json是调试的配置文件,包括使用什么调试器(比如使用gdb),调试时执行哪个文件等
tasks.json是调试前的执行任务。
launch.json中的“preLaunchTask”和tasks.json中的“label”标签的值对应。
对于复杂一点,有包含关系的项目时,按照如上步骤,就会报错:
报错是因为自动生成的launch.json和tasks.json中并不知道项目中文件结构具体是怎样的。
这个时候,就只能先中止,然后修改tasks.json文件了。
修改tasks.json文件tasks内的args参数,即将其修改成g++的编译指令即可。
这里需要注意语法规范,一对双引号内不能有空格,有空格的拆开成两个用都号隔开,
-o后面的的参数,即编译生成的可执行文件必须与launch.json中的“program”的值一样,否则vscode不知道调试哪个。
2、CMake
2.1 CMake的基础指令
1、cmake_minimum_required
用于指定需要的 CMake 的最低版本
例:cmake_minimum_required(VERSION 2.8)
2、project
用于指定项目的名称
例:project(Main)
3、aux_source_directory
语法:aux_source_directory(<dir> <variable>)
用于将 dir 目录下的所有源文件的名字保存在变量 variable 中
例:aux_source_directory(. DIR_SRCS)
4、include_directories
语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
用于设定include目录,
使例:include_directories(${PROJECT_SOURCE_DIR}/include)
5、add_executable
语法:add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)
用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为 name
使用范例:add_executable(Main ${DIR_SRCS})
6、set 命令
set(<variable> <value> [[CACHE <type><docstring> [FORCE]] | PARENT_SCOPE])
用于设定变量 variable 的值为 value。如果指定了 CACHE 变量将被放入 Cache(缓存)中。
例:set(ProjectName Main)
7、target_link_libraries
语法:target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)
用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)
例:target_link_libraries(Main OpenCV_LIBS)
8、message 命令用于输出信息
例:message(“Hello World”)
2.2、CMake构建示例
先写一个简单的项目,如下,我只展示了头文件,具体实现请自行脑补。
对于这样一个小项目,使用g++编译的话,可以这样写:
g++ main.cpp src/Gun.cpp src/Soldier.cpp -Iinclude -o FightMain
使用CMake来构建:
2.2.1、编写CMakeLists.txt
在项目的根目录下,创建CMakeLists.txt文件,写入如下内如
# 设置最小版本
cmake_minimum_required(VERSION 3.16)
# 项目名称
project(SOLDIER_FIRE)
# 添加一些参数,比如-g调试,-O2优化,-Wall显示警告信息
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")
# 打开Debug宏
set(CMAKE_BUILD_TYPE Debug)
# 包含目录,头文件所在目录
include_directories(${CMAKE_SOURCE_DIR}/include/)
# 把src下面的cpp文件都捆起来
aux_source_directory(${CMAKE_SOURCE_DIR}/src/ DIR_SRCS)
# 生成可执行文件
add_executable(MainCmakeDebug main.cpp ${DIR_SRCS})
2.2.2、使用CMake进行构建(外部构建)
有两种方式构建,内部和外部之分,内部构建就是直接在代码所在文件中构建,这种比较混乱
主要推荐使用外部构建,即创建一个文件夹用于构建,创建的文件夹,一般约定好,起名 build
进入build目录,再执行cmake ..(两个点,就是执行上层目录中的CMakeLists.txt,在当前build目录中生成makefile和其他中间文件)
最后对生成的中间文件及makefile等进行make
mkdir build
cd build
cmake ..
make
3、VSCode+CMake
使用VSCode+CMake,实现一键编译与调试
3.1、修改tasks.json
按照第一节中说的,先创建launch.json和tasks.json两个文件
接着对tasks.json文件进行重写,如下:
{
"version": "2.0.0",
"options": {
//进入build目录
"cwd": "${workspaceFolder}/build"
},
"tasks":
[
{
"label": "cmake",
"command": "cmake",
"args":
[
//cmake ..
".."
]
},
{
"label": "make",
"command": "make",
"args": [],
},
{
"type":"shell",
//这个label和launch.json中的preLaunchTask对应
"label": "Build",
"dependsOrder": "sequence",
"dependsOn":
[
//先执行cmake任务,和上面的label对应
"cmake",
//接着执行make,和上面的label对应
"make"
]
}
]
}
3.2、修改launch.json
主要修改其中的
……
//CMakeLists.txt中所写的最终生成的可执行文件名字
"program": "${workspaceFolder}/build/MainCmakeDebug",
……
//即前面提到tasks.json中的"label":"Build"
"preLaunchTask": "Build",
……
这样,就只用点击VSCode的调试按钮,就会自动构建并进入调试了。