「C++学习笔记」Linux上的C++开发编译入门(三)(VSCode, CMake)

我的同事@ 在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.jsontasks.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的调试按钮,就会自动构建并进入调试了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值