基本语法:

包含2方面内容:

  1. 命令(不区分大小写,由命令名称、小括号和参数组成,参数之间使用空格进行间隔)
  2. 注释(#号开头)

以下是参考示例:

cmake_minimum_required(VERSION 3.5)
# 设置加载显示的工程名称
project(MeasureProject VERSION 0.1 LANGUAGES CXX)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
set(CMAKE_AUTOUIC ON)
set(CMAKE_CXX_STANDARD 20)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/debug/bin)

add_subdirectory(src)

标识 数据

VERSION 0.1
LANGAUGES CXX

常用命令

cmake_minimum_required(VERSION 3.5)
project(Test VERSION 0.1 LANGUAGES CXX)
  • 指定可执行文件目标命令:
# file命令:获取指定目录下所有匹配的文件
# GLOB_RECURSE:递归获取
# SRC:将获取到的文件存储在SRC变量中
file(GLOB_RECURSE SRC
    *.h
    *.cpp
    *.ui
)

# 指定一个可可执行目标为:service_test,WIN32表明在windows平台下,$(SRC)标识此变量下的所有文件
add_executable(service_test WIN32 ${SRC})
  • 查询某个文件夹下的所有源文件(*.cpp)
# . :表示在当前文件夹下查找
# SRC:查找结果存储在SRC变量中
aux_source_directory(. SRC)
  • 设定C++版本
target_compile_features(myTarget PUBLIC cxx_std_11)
set_target_properties(myTarget PROPERTIES CXX_EXTENSIONS OFF)
  • 地址无关的代码(PIC)
    通常层面,cmake会对SHARD MODULE默认设置地址无关代码(-fPIC),也可以手动配置:
//全局配置
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
//针对某个target设置
set_target_properties(lib1 PROPERTIES POSITION_INDEPENDENT_CODE ON)
  • 在本项目中添加子目录:
# 指定子目录后,子目录的cmakelists.txt以及源文件都会被加载
add_subdirectory(math)

# 添加链接库
target_link_libraries(Demo MathFunctions)

--------------------------------------------------------------------------------
# 子目录下的cmakelists.txt
# 生成链接库:静态链接库
add_library (MathFunctions ${DIR_LIB_SRCS})
  • 新增自定义选项:条件判断是否加载某一个库
# 是否使用自己的 MathFunctions 库,根据是否定义USE_MYMATH这个宏来判断
option (USE_MYMATH
       "Use provided math implementation" ON)

# 是否加入 MathFunctions 库
if (USE_MYMATH)
  # 添加包含头文件目录,用于编译
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
  • 使用配置文件对编译项进行配置
# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

config.h.in是一个模板,configure_file命令会将其复制到config.h中,并进行相应替换。内容如下:

#cmakedefine USE_MYMATH
#define PROJECT_VERSION "@PROJECT_VERSION@"
#define ENABLE_FEATURE_X @ENABLE_FEATURE_X@

其中:”@PROJECTVERSION@” 会替换成PROJECTVERSION变量的具体内容,属于占位符

  • 配置安装规则

# 将生成的可执行目标Demo放置在bin目录下
install (TARGETS Demo DESTINATION bin)

# 将生成的config.h放在include下
install (FILES "${PROJECT_BINARY_DIR}/config.h"
         DESTINATION include)

开启在原目录和构建目录在编译器中可见

set(CMAKE_INCLUDE_CURRENT_DIR ON)

作用是方便编译器查找头文件,比如moc文件会生成在构建目录,如果不设置可能找不到对应的moc文件

  • 创建路径变量
# 最基础使用拼接
set(path1 "${CMAKE_CURRENT_SOURCE_DIR}/data")
cmake_path(SET path2 "${CMAKE_CURRENT_SOURCE_DIR}/data")
# 最推荐的方式
cmake_path(APPEND path3 "${CMAKE_CURRENT_SOURCE_DIR}" "data")
  • 分解路径变量到某一个变量中
cmake_path(GET <path-var> ROOT_NAME <out-var>)
cmake_path(GET <path-var> ROOT_DIRECTORY <out-var>)
cmake_path(GET <path-var> ROOT_PATH <out-var>)
cmake_path(GET <path-var> FILENAME <out-var>)
cmake_path(GET <path-var> EXTENSION [LAST_ONLY] <out-var>)
cmake_path(GET <path-var> STEM [LAST_ONLY] <out-var>)
cmake_path(GET <path-var> RELATIVE_PART <out-var>)
cmake_path(GET <path-var> PARENT_PATH <out-var>)

#示例:
set(path "C:/a")
# 提取path的root路径名:C
cmake_path(GET path ROOT_NAME rootName)
cmake_path(GET path ROOT_PATH rootPath)
cmake_path(GET path ROOT_DIRECTORY rootDir)

message("Root name is \"${rootName}\"")
message("Root directory is \"${rootDir}\"")
message("Root path is \"${rootPath}\"")

#输出值为:
Root name is "c:"
Root directory is "/"
Root path is "c:/"

路径变量的cmake文档参考:
https://cmake-doc.readthedocs.io/zh-cn/latest/command/cmake_path.html#cmake-path-set

添加一个插件包

include(CMakeParseArguments)

# 生成插件动态库
# 使用方法:rv_add_plugin(target_name SOURCES <source files> DEPENDS <link libraries> PLUGIN_DEPENDS <depend plugins>)
function(rv_add_plugin TARGET)
    set(OPTIONS)
    set(ONE_ARGS)
    set(MULTI_ARGS SOURCES DEPENDS PLUGIN_DEPENDS)
    cmake_parse_arguments(ARG "${OPTIONS}" "${ONE_ARGS}" "${MULTI_ARGS}" ${ARGN})

    set(PLUGIN_NAME ${PROJECT_NAME})
    set(PLUGIN_VERSION ${PROJECT_VERSION})
    rv_parse_plugin_depends(${ARG_PLUGIN_DEPENDS})
    configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.json.in
        ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.json
        @ONLY)

    add_library(${TARGET} SHARED
        ${ARG_SOURCES}
    )

    target_link_libraries(${TARGET} PRIVATE
        ${ARG_DEPENDS}
    )

    set_target_properties(${TARGET} PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/plugin"
        RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/plugin"
        RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/plugin"
    )
endfunction()

function(rv_parse_plugin_depends)
    # TODO: 应该传进来版本号,暂时写死用全局的版本号
    set(VERSION ${TSP_VERSION_MAJ}.${TSP_VERSION_MIN}.${TSP_VERSION_PATCH})
    set(LIST PARENT_SCOPE)
    set(INDEX 0)
    foreach(DEP ${ARGV})
        if(${ARGC} STREQUAL "1")
            set(LIST "{\"Name\" : \"${DEP}\",\"Version\" :\"${VERSION}\"}")
        else()
            math(EXPR INDEX "${INDEX} + 1")
            if(${INDEX} STREQUAL ${ARGC})
                set(LIST "${LIST} {\"Name\" : \"${DEP}\",\"Version\" :\"${VERSION}\"}")
            else()
                set(LIST "${LIST} {\"Name\" : \"${DEP}\",\"Version\" :\"${VERSION}\"}, ")
            endif()
        endif()
    endforeach()
    set(DEPENDENCY_LIST ${LIST} PARENT_SCOPE)
endfunction()

在vscode中设置cmake Release模式下生成调试信息:

#在Release模式下生成调试信息
set(RELEASE_WITH_DEBUG_INFO ON CACHE BOOL "Load th" FORCE)
if(RELEASE_WITH_DEBUG_INFO)
    if(MSVC)
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi /O2")
        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG")
    else()
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g -O3")
    endif()
endif()

常用标识:

标识 描述
VERSION 版本信息
LANGAUGES 语言相关信息如:CXX,指编写的代码语言
GLOB_RECURSE 递归查询参数
GLOB 查询参数
作者:admin  创建时间:2023-07-03 16:21
最后编辑:admin  更新时间:2025-02-17 15:46