0. CMake应用示例
之前我们也整理过cmake 引入第三方库(头文件目录、库目录、库文件)。但是这里面整理的内容其实是不全的。所以我们需要进一步将CMake的使用整理好。以供后面的学习的工程师来检索查询。
cmake-template
├── CMakeLists.txt
└── build
└── include
└── src
└── main.cpp
1. CMakeList基础15例
# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.15)
# 设置项目名称和版本
project(MyProject VERSION 1.0 DESCRIPTION "An example project with CMake")
# 选项,可以通过-D在命令行定义
option(USE_CUSTOM_LIBRARY "Use a custom library" ON)
# 定义条件预处理器宏
if(USE_CUSTOM_LIBRARY)
add_definitions(-DUSE_CUSTOM_LIB)
endif()
# 寻找外部依赖包
find_package(Threads REQUIRED)
# 指定头文件的搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 指定库文件搜索路径
link_directories(${PROJECT_SOURCE_DIR}/libs)
# 添加子目录,这些目录下也应该有自己的CMakeLists.txt
add_subdirectory(src)
add_subdirectory(libs)
# 添加一个可执行文件
add_executable(myExecutable src/main.cpp)
# 添加一个静态库
add_library(myStaticLib STATIC src/myStaticLib.cpp)
# 添加一个动态库
add_library(mySharedLib SHARED src/mySharedLib.cpp)
# 设置静态库和动态库的属性
set_target_properties(myStaticLib PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/static_lib"
)
set_target_properties(mySharedLib PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/shared_lib"
VERSION ${PROJECT_VERSION}
)
# 设置可执行文件的属性
set_target_properties(myExecutable PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
OUTPUT_NAME "myExecutableFinal"
)
# 指定链接库
target_link_libraries(myExecutable PRIVATE myStaticLib mySharedLib Threads::Threads)
# 安装规则
install(TARGETS myExecutable myStaticLib mySharedLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static
)
# 包含目录
target_include_directories(myExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)
# 自定义命令和依赖
add_custom_target(run
COMMAND myExecutable
)
add_dependencies(run myExecutable)
# 宏定义,用于打印消息
macro(print_details)
message("Project details: ${PROJECT_NAME} version ${PROJECT_VERSION}")
endmacro()
print_details()
# 文件操作示例
file(GLOB_RECURSE MY_SOURCES "src/*.cpp")
target_sources(myExecutable PRIVATE ${MY_SOURCES})
# 配置文件生成
configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h)
# 源文件目录搜索
aux_source_directory(. DIR_SRCS)
add_executable(myProgram ${DIR_SRCS})
# 添加目录,引入其他项目
add_subdirectory(external)
# 自定义目标,不产生输出文件
add_custom_target(CustomCommand ALL
COMMAND echo "Executing a custom command"
COMMENT "This is a custom build step"
)
# 文件复制命令
file(COPY ${CMAKE_SOURCE_DIR}/data.txt DESTINATION ${CMAKE_BINARY_DIR})
1.1 cmake_minimum_required
制定CMake的最小版本。它确保了 CMake 的特定版本或更高版本的特性能够被利用,并且保证了在旧版本的 CMake 中可能导致未知行为的特性不会被误用。
基本语法:
cmake_minimum_required(VERSION major.minor[.patch][.tweak] [FATAL_ERROR])
VERSION
关键字后面跟着所需的最低版本号。FATAL_ERROR
是一个可选的参数,它在 CMake 的老版本中是必需的,如果用户使用的是比指定的 VERSION 更老的 CMake 版本,CMake 会报告一个致命错误并停止处理。在新版本的 CMake 中,默认情况下,如果版本不满足要求,CMake 就会报错并停止。
1.2 project
声明项目的名称和版本,并可选择指定支持的编程语言.此指令通常位于CMakeLists.txt
文件的顶部,紧跟在cmake_minimum_required
指令之后。
基本语法:
project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
<PROJECT-NAME>
是你的项目名称。VERSION
关键字后面可以跟随项目的版本号。DESCRIPTION
可以添加项目描述。HOMEPAGE_URL
可以指定项目主页的URL。LANGUAGES
关键字后面可以跟一系列编程语言名称,例如 C, CXX (代表C++),CUDA,Fortran 等。如果不指定语言,CMake默认启用 C 和 CXX。
1.3 $$
CMake中的美元符号与括号一起使用,形如{...}
,用于引用变量的值。最常用的就是和project联系起来,例如:
基本语法:
# 设置项目名称和版本
project(MyProject VERSION 1.2.3 LANGUAGES CXX)
set(MY_VARIABLE "Hello, World")
message("Project name: ${PROJECT_NAME}")
message("Project version: ${PROJECT_VERSION}")
message(${MY_VARIABLE})
{MY_VARIABLE} 会被 CMake 替换为变量 MY_VARIABLE 的值.而`project` 指令将会创建一些变量,比如 `PROJECT_NAME`,`PROJECT_VERSION` 等,这些变量随后可以被引用。
#### 1.4 set
在CMake中,`set`命令用于定义和修改变量。这个命令非常灵活,是CMake脚本中用得最频繁的指令之一,因为它可以用来存储各种类型的数据,如字符串、文件路径、列表(即字符串数组)、布尔值等。
基本语法:
set(