使用CMake进行C++项目管理

1、CMakeLists.txt基本结构

使用VS2022创建一个CMake工程后,生成的默认配置文件CMakeLists.txt如下:

# CMakeList.txt: CMakeTest 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

# 如果支持,请为 MSVC 编译器启用热重载。
if (POLICY CMP0141)
  cmake_policy(SET CMP0141 NEW)
  set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
endif()

project ("CMakeTest")

# 将源代码添加到此项目的可执行文件。
add_executable (CMakeTest "CMakeTest.cpp" "CMakeTest.h")

if (CMAKE_VERSION VERSION_GREATER 3.12)
  set_property(TARGET CMakeTest PROPERTY CXX_STANDARD 20)
endif()

# TODO: 如有需要,请添加测试并安装目标。

将CMakeSettings.json修改,连接到远程Linux服务器。

{
  "configurations": [
    {
      "name": "Linux-GCC-Debug",
      "generator": "Unix Makefiles",
      "configurationType": "Debug",
      "cmakeExecutable": "cmake",
      "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ],
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "inheritEnvironments": [ "linux_x64" ],
      "remoteMachineName": "${defaultRemoteMachineName}",
      "remoteCMakeListsRoot": "$HOME/${projectDirName}/src",
      "remoteBuildRoot": "$HOME/${projectDirName}/build/${name}",
      "remoteInstallRoot": "$HOME/${projectDirName}/install/${name}",
      "remoteCopySources": true,
      "rsyncCommandArgs": "-t --delete",
      "remoteCopyBuildOutput": false,
      "remoteCopySourcesMethod": "rsync"
    },
    {
      "name": "Linux-GCC-Release",
      "generator": "Unix Makefiles",
      "configurationType": "Release",
      "cmakeExecutable": "cmake",
      "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ],
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "inheritEnvironments": [ "linux_x64" ],
      "remoteMachineName": "${defaultRemoteMachineName}",
      "remoteCMakeListsRoot": "$HOME/${projectDirName}/src",
      "remoteBuildRoot": "$HOME/${projectDirName}/build/${name}",
      "remoteInstallRoot": "$HOME/${projectDirName}/install/${name}",
      "remoteCopySources": true,
      "rsyncCommandArgs": "-t --delete",
      "remoteCopyBuildOutput": false,
      "remoteCopySourcesMethod": "rsync"
    }
  ]
}

2、添加宏定义

 (1)add_definitions定义宏

对于无值宏:add_definitions(-DBOOST_ALL_DYN_LINK)
对应于C语言中的  #define BOOST_ALL_DYN_LINK
对有值宏:add_definitions(-DLIBEVENT_VERSION_NUMBER=0x02010800)
对应C语言:#define LIBEVENT_VERSION_NUMBER 0x02010800

(2)add_compile_definitions定义宏

这个指令需要高cmake版本才能支持。比如:add_compile_definitions(MG_ENABLE_OPENSSL=1)
对应于C语言中的  #define MG_ENABLE_OPENSSL 1
add_compile_definitions(BOOST_LOG_DYN_LINK)

CMakeLists.txt 文件中定义的宏在后面C/C++程序中是可以直接使用。

add_definitions(-DBOOST_ALL_DYN_LINK)
add_definitions(-DZLIB_VERSION 0X21)

add_compile_definitions(ZLIB_VERSION=0X21)
add_compile_definitions(BOOST_ALL_DYN_LINK)

3、设置GCC路径

set(CMAKE_C_COMPULER \"/usr/local/bin/gcc\")
set(CMAKE_CXX_COMPULER \"/usr/local/bin/g++\")

4、头文件和库

# 1. 指定头文件位置
target_include_directories(test PRIVATE "${PROJECT_SOURCE_DIR}/../loglib/include")
# 2. 指定库文件搜索位置
target_link_directories(test PRIVATE "${PROJECT_SOURCE_DIR}/../loglib/bin")
# 3. 指定需要链接的库
target_link_libraries(test -ltacopie -lcpo_redis)

file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 4. 生成可执行文件
add_executable(test ${SRC_LIST})

# 5. 生成动态链接库
add_library(utility utility.cpp convert.cpp)

add_executable(test.exe main.cpp) 
# 6. 链接库
target_link_libraries(test.exe utility)

#add_library写明了生成一个叫做utility.a的库文件,
#然后和main.cpp编译出来的main.o生成可执行文件

5、复制文件

要在CMake中将配置文件复制到输出目录,两种方式
(1)configure_file(setting.xml ${CMAKE_CURRENT_BINARY_DIR}/setting.xml COPYONLY)
(2)file(COPY setting.xml DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

6、QT库配置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值