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

简单模板:

cmake_minimum_required(VERSION 3.12)

project(testspdlog CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED on)

add_executable(testspdlog main.cpp)

set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_FLAGS "-Wall")


target_include_directories(testspdlog PRIVATE /home/yan/soft/spdlog-1.13.0/include)

target_link_libraries(testspdlog PRIVATE 
    /home/yan/soft/spdlog-1.13.0/build-debug/libspdlogd.a
    pthread 
)

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

编写CMakeLists.txt 文件,示例

#设置最低版本
cmake_minimum_required(VERSION 3.12)
#项目名称,标明使用c++语言
project(testspdlog CXX)
#设置使用c++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED on)
#添加生成可执行文件的cpp
add_executable(testspdlog main.cpp)
# 设置编译选项,显示警告
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_FLAGS "-Wall")

#旧版语法,设置包含目录和链接目录,已不建议使用
#include_directories(/home/yan/soft/spdlog-1.13.0/include)
#link_directories(/home/yan/soft/spdlog-1.13.0/build-debug)
#避免使用link_directories,应为它:全局生效,影响后续所有target;容易因顺序问题失效
#建议直接指定完整路径或使用 IMPORTED target 
#target_link_libraries(testspdlog PRIVATE spdlogd)

# 添加头文件路径
target_include_directories(testspdlog PRIVATE /home/yan/soft/spdlog-1.13.0/include)

# 直接链接 .a 文件(直接指定完整路径),与使用 IMPORTED target 二选一
# target_link_libraries(testspdlog PRIVATE 
#     /home/yan/soft/spdlog-1.13.0/build-debug/libspdlogd.a
#     pthread  # spdlog 需要线程库!
# )

# 显式查找库文件
find_library(SPDLOG_DEBUG_LIB spdlogd
    PATHS /home/yan/soft/spdlog-1.13.0/build-debug
    NO_DEFAULT_PATH
)
#使用 IMPORTED target
target_link_libraries(testspdlog PRIVATE ${SPDLOG_DEBUG_LIB} pthread)

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

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

mkdir build
cd build
cmake ..(..代表上层目录,可以使用-DCMAKE_BUILD_TYPE=release参数指定生成release版本,或者在cmakelists中指定默认版本)
make -j4
最后会生成可执行文件
./example运行

三: 程序的编译链接

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

姿势2:创建CMakeLists.txt,然后mkdir build;cd build;cmake ..;make;./youExeName
或者使用vscode的工具 cmaketool,更方便

按F1选择编译器,CMakeLists.txt文件目录
修改CMakeLists直到不报错(不标红)
F7编译,修改源码直到不报错(不标红)
运行

如果你要编译运行当前目录下其他的测试程序,记得点击“删除缓存并重新配置按钮”

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

  1. 安装JsonCpp *现在不建议使用vcpkg 安装
  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运行

四: 调试

后续补充

posted on 2024-09-04 16:03  不败剑坤  阅读(1489)  评论(0)    收藏  举报

导航