使用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 值,包括 字符串的序列化和反序列化。
- 首先使用使用 vcpkg 安装JsonCpp
- 常见一个示例程序,程序如下
#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
- 使用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运行
- 使用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文件夹
- 使用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": "调试器生成的任务。"
}
四: 调试
-
默认调试选项为GDB调试,只要可以生成成功即可启动调试
单机右上角三角形>调试c++文件即可 -
使用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】这里说的’>‘是什么?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?