使用Cmake-编写CMakeLists.txt 文件,vscode

一:使用cmake的好处:
a) 可以轻松管理多个源文件、库和依赖关系
b) cmake可以自动生成makefile,跨平台(makefile跟平台强相关)

编写CMakeLists.txt 文件,示例


#关键主体:
cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(my_project)

#编译器版本c++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 设置编译选项,显示警告
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_FLAGS "-Wall")

# 获取所有 .cpp 文件
file(GLOB SOURCES "*.cpp")

# 添加可执行文件
#add_executable(my_project main.cpp)
#更正:只指定main.cpp这会导致其他源文件不会被编译和链接,如果有其他源文件,需要获取所有
add_executable(my_gatserver ${SOURCES})

# 配置 vcpkg 工具链文件,如果使用vcpkg 
#set(CMAKE_TOOLCHAIN_FILE "/home/yan/vcpkg/scripts/buildsystems/vcpkg.cmake")

# 指定 JsonCpp 的头文件路径
include_directories(/home/yan/vcpkg/installed/x64-linux/include)

# 指定 JsonCpp 的库路径
link_directories(/home/yan/vcpkg/installed/x64-linux/lib)
#这个路径一定要确认好

# 链接 JsonCpp 库

target_link_libraries(my_project PRIVATE jsoncpp)

使用命令cmake ..系统会调用CMakeLists.txt文件生成makefile
使用code makefile命令调用vscode查看生成的makefile文件

二:创建build文件夹
目的:避免生成的临时文件和源文件混在一起

mkdir build
cd build
cmake ..(..代表上层目录)
make
最后会生成可执行文件
./example运行

三: 程序的编译链接

姿势1:bash中使用编译链接命令

姿势2:创建CMakeLists.txt,然后mkdir build;cd build;cmake ..;make;./youExeName

姿势3:vscode右侧运行按钮(编写tasks.json,主要是添加包含目录,库目录,链接)g++

姿势3:vscode右侧运行按钮(使用vscode 在tasks.json中调用CMakeLists)cmake

四: 案例:jsoncpp测试
JsonCpp 是一个 C++ 库,允许操作 JSON 值,包括 字符串的序列化和反序列化。

  1. 首先使用使用 vcpkg 安装JsonCpp
  2. 常见一个示例程序,程序如下
#include <iostream>
#include <json/json.h>
#include <json/value.h>
#include <json/reader.h>

int main()
{
    Json::Value root;
    root["id"] = 1001;
    root["data"] = "hello world";
    std::string request = root.toStyledString();
    std::cout << "request is " << request << std::endl;

    Json::Value root2;
    Json::Reader reader;
    
    reader.parse(request, root2);
    std::cout << "msg id is " << root2["id"] << " msg is " << root2["data"] << std::endl;
}

此时目录结构:
your_project/
└── main.cpp

直接使用g++编译运行
g++ -std=c++17 -o example main.cpp -I/home/yan/vcpkg/installed/x64-linux/include -L/home/yan/vcpkg/installed/x64-linux/lib -ljsoncpp
解释:-o 可执行文件名,-I include 文件,-L 库文件(lib文件)-ljsoncpp 链接到jsoncpp库,注意前面是-l

  1. 使用cmake构建
    创建cmakelist.txt
    此时目录结构:
    your_project/
    ├──CMakeLists.txt
    └──main.cpp

CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(my_project)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 获取所有 .cpp 文件
file(GLOB SOURCES "*.cpp")

# 添加可执行文件
add_executable(my_project main.cpp)

# 配置 vcpkg 工具链文件
set(CMAKE_TOOLCHAIN_FILE "/home/yan/vcpkg/scripts/buildsystems/vcpkg.cmake")

# 指定 JsonCpp 的头文件路径
include_directories(/home/yan/vcpkg/installed/x64-linux/include)

# 指定 JsonCpp 的库路径
link_directories(/home/yan/vcpkg/installed/x64-linux/lib)
#这个路径一定要确认好

# 链接 JsonCpp 库

target_link_libraries(my_project PRIVATE jsoncpp)

然后,创建build文件夹,mkdir build
cd build
cmake ..(..代表上层目录)
make
最后会生成可执行文件
./example运行

  1. 使用vscode配合cmake构建

配置任务>使用模板创建tasks文件>others
此时会创建一个.vscode文件夹,和一个文件tasks.json
此时目录结构:
your_project/
├── .vscode/
│ └── tasks.json
├── CMakeLists.txt
└── main.cpp

编写tasks.json文件,内容如下:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [        
        {
            "label": "cmake configure",
            "type": "shell",
            "command": "cmake",
            "args": [
                "-B",
                "${workspaceFolder}/build", // 指定构建目录
                "-S",
                "${workspaceFolder}", // 指定源代码目录
                "-DCMAKE_BUILD_TYPE=Debug" ,// 构建类型,这里设置为 Debug
                "-DCMAKE_TOOLCHAIN_FILE=/home/yan/vcpkg/scripts/buildsystems/vcpkg.cmake" // 配置 vcpkg 工具链文件
            ],
            "dependsOn": ["create build directory"],
            "group": {
                "kind": "build",
                "isDefault": false
            },
            "problemMatcher": ["$gcc"],
            "detail": "Configure the project with CMake"
        },
        {
            "label": "cmake build",
            "type": "shell",
            "command": "cmake",
            "args": [
                "--build",
                "${workspaceFolder}/build", // 指定构建目录
                "--config",
                "Debug", // 构建类型,这里设置为 Debug
                "--target",
                "my_project", // 目标名称,与 CMakeLists.txt 中 add_executable 定义的一致
                "--",
                "-j4" // 使用 4 个并行任务进行构建
            ],
            "dependsOn": ["cmake configure"],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": ["$gcc"],
            "detail": "Build the project with CMake"

        }
    ]

}

如果项目不需要配置 vcpkg 工具链文件,则只需要cmake build任务
使用>运行任务>cmake configure,>运行任务>cmake build,随后项目被编译链接到build文件夹

  1. 使用vscode 配合g++构建
    相对简单,单机右上角三角形,选择g++11,会自动创建任务到tasks.json文件中,
    对任务进行配置即可
    添加头文件目录,库目录,链接库,内容如下:
{
            "type": "cppbuild",
            "label": "C/C++: g++-11 生成活动文件",
            "command": "/usr/bin/g++-11",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-I",
                "/home/yan/vcpkg/installed/x64-linux/include",
                "-L",
                "/home/yan/vcpkg/installed/x64-linux/lib",
                "-ljsoncpp"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }

四: 调试

  1. 默认调试选项为GDB调试,只要可以生成成功即可启动调试
    单机右上角三角形>调试c++文件即可

  2. 使用cmake调试
    创建launch文件,添加调试配置>GDB启动
    修改配置:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [

        {
            "name": "(gdb) 元神启动",
            "type": "cppdbg",
            "request": "launch",

            "program": "${workspaceFolder}/build/my_project",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }

    ]
}

然后运行调试,即可看到 (gdb) 元神启动的调试选项,即可调试

五:注意事项
cmakelist中,有时候有些库和头文件并不能自动找到,如:

# # 查找 JsonCpp 库
# find_package(JsonCpp REQUIRED)

可能由于多种原因,找不到就是找不到,此时手动指定较好

# 指定 JsonCpp 的头文件路径
include_directories(/home/yan/vcpkg/installed/x64-linux/include)
# 指定 JsonCpp 的库路径
link_directories(/home/yan/vcpkg/installed/x64-linux/lib)
#这个路径一定要确认好

六:
最后,如果你不知道【使用>运行任务>cmake configure,>运行任务>cmake build】这里说的’>‘是什么?

posted on   不败剑坤  阅读(706)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示