CMake常用命令

项目配置

# 设置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的大部分常用功能,足以应对大多数项目的构建需求。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注