项目配置
# 设置CMake最低版本要求
cmake_minimum_required(VERSION 3.10)
# 定义项目名称和版本
project(MyProject VERSION 1.0.0)
# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 设置构建类型
set(CMAKE_BUILD_TYPE Release)
变量设置
# 设置变量
set(VARIABLE_NAME "value")
set(SOURCE_FILES main.cpp util.cpp)
# 获取变量
message(STATUS "Variable value: ${VARIABLE_NAME}")
# 追加到变量
set(SOURCE_FILES ${SOURCE_FILES} new_file.cpp)
目录和路径
# 添加头文件搜索路径
include_directories(include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# 添加库文件搜索路径
link_directories(lib)
# 添加子目录
add_subdirectory(src)
add_subdirectory(tests)
可执行文件和库
# 创建可执行文件
add_executable(myapp main.cpp)
# 创建静态库
add_library(mylib STATIC lib.cpp)
# 创建动态库
add_library(mylib SHARED lib.cpp)
# 创建头文件库(接口库)
add_library(mylib INTERFACE)
链接和依赖
# 链接库到目标
target_link_libraries(myapp mylib)
target_link_libraries(myapp pthread)
# 设置目标属性
set_target_properties(myapp PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED ON
)
# 添加头文件包含路径(推荐方式)
target_include_directories(myapp PRIVATE include)
target_include_directories(myapp PUBLIC include)
查找包和库
# 查找系统包
find_package(OpenCV REQUIRED)
find_package(Boost REQUIRED COMPONENTS system filesystem)
# 查找库文件
find_library(MATH_LIB m)
# 查找头文件
find_path(HEADER_PATH myheader.h)
# 使用找到的包
target_link_libraries(myapp ${OpenCV_LIBS})
编译选项
# 添加编译选项
add_compile_options(-Wall -Wextra)
# 针对特定目标添加编译选项
target_compile_options(myapp PRIVATE -O2)
# 添加预处理器定义
add_definitions(-DDEBUG)
target_compile_definitions(myapp PRIVATE DEBUG=1)
文件操作
# 获取文件列表
file(GLOB SOURCES "src/*.cpp")
file(GLOB_RECURSE HEADERS "include/*.h")
# 复制文件
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/config.txt
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
# 创建目录
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/output)
条件语句
# if语句
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-DDEBUG)
endif()
# if-else语句
if(WIN32)
set(PLATFORM "Windows")
elseif(APPLE)
set(PLATFORM "macOS")
else()
set(PLATFORM "Linux")
endif()
循环
# foreach循环
set(ITEMS a b c)
foreach(item ${ITEMS})
message(STATUS "Item: ${item}")
endforeach()
# 遍历文件
file(GLOB FILES "*.cpp")
foreach(file ${FILES})
message(STATUS "File: ${file}")
endforeach()
函数和宏
# 定义函数
function(my_function arg1 arg2)
message(STATUS "Args: ${arg1}, ${arg2}")
endfunction()
# 调用函数
my_function("hello" "world")
# 定义宏
macro(my_macro arg)
set(${arg} "processed")
endmacro()
安装配置
# 安装可执行文件
install(TARGETS myapp
RUNTIME DESTINATION bin)
# 安装库文件
install(TARGETS mylib
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib)
# 安装头文件
install(FILES myheader.h
DESTINATION include)
# 安装目录
install(DIRECTORY include/
DESTINATION include)
测试
# 启用测试
enable_testing()
# 添加测试
add_test(NAME test1 COMMAND myapp --test)
add_test(NAME test2 COMMAND test_runner)
# 设置测试属性
set_tests_properties(test1 PROPERTIES TIMEOUT 30)
生成器表达式
target_compile_options(myapp PRIVATE
$<$<CONFIG:Debug>:-g -O0>
$<$<CONFIG:Release>:-O3>
)
# 根据编译器设置选项
target_compile_options(myapp PRIVATE
$<$<CXX_COMPILER_ID:GNU>:-Wall>
$<$<CXX_COMPILER_ID:MSVC>:/W3>
)
调试和信息输出
# 输出消息
message(STATUS "This is a status message")
message(WARNING "This is a warning")
message(FATAL_ERROR "This is a fatal error")
# 打印变量
message(STATUS "CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}
常用内置变量
# 项目相关
${PROJECT_NAME} # 项目名称
${PROJECT_VERSION} # 项目版本
${PROJECT_SOURCE_DIR} # 项目源码目录
${PROJECT_BINARY_DIR} # 项目构建目录
# 当前目录
${CMAKE_CURRENT_SOURCE_DIR} # 当前源码目录
${CMAKE_CURRENT_BINARY_DIR} # 当前构建目录
# 编译器相关
${CMAKE_CXX_COMPILER} # C++编译器
${CMAKE_BUILD_TYPE} # 构建类型
${CMAKE_SYSTEM_NAME} # 系统名称
常用构建命令
# 创建构建目录
mkdir build && cd build
# 配置项目
cmake ..
cmake -DCMAKE_BUILD_TYPE=Release ..
# 编译项目
cmake --build .
cmake --build . --config Release
# 安装项目
cmake --install .
# 运行测试
ctest
这些命令覆盖了CMake的大部分常用功能,足以应对大多数项目的构建需求。