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})