跳到主要内容

CMake 常用命令

CMake 支持大写、小写、混合大小写的命令。

预定义

PROJECT_NAME              # 项目名称
CMAKE_SOURCE_DIR # 最外层CMakeLists.txt的目录
PROJECT_SOURCE_DIR # 当前CMakeLists.txt 所在的目录
CMAKE_CURRENT_SOURCE_DIR # 当前CMakeLists.txt 所在的目录
CMAKE_CURRENT_BINARY_DIR # 当前项目的编译输出目录
CMAKE_CURRENT_LIST_FILE # 当前CMakeLists.txt的绝对路径
CMAKE_CURRENT_LIST_LINE # 输出当前行

系统变量

CMAKE_MAJOR_VERSION 	  # cmake主版本号,如3.8.5中的3
CMAKE_MINOR_VERSION # cmake次版本号,如3.8.5中的8
CMAKE_PATCH_VERSION # cmake补丁等级,如3.8.5中的5
CMAKE_SYSTEM # 系统名称
CAMKE_SYSTEM_NAME # 不包含版本的系统名
CMAKE_SYSTEM_VERSION # 系统版本
CMAKE_SYSTEM_PROCESSOR # 处理器名称
UNIX # 在所有的类UNIX平台为TRUE,包括OS X和cygwin
WIN32 # 在所有的win32平台为TRUE,包括cygwin

编译选项

# 设置c++版本
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ")

CMakeList 使用流程

设置最低的CMake版本

cmake_minimum_required(VERSION 3.10)

设置工程名称

project(project_name)

创建Source变量,且链接了需要编译的cpp文件

set(SOURCES main.cpp)

aux_source_directory

在目录中查找所有源文件。

aux_source_directory(<dir> <variable>)

收集指定目录中所有源文件的名称,并将列表存储在提供的 <variable> 变量中。 该命令旨在供使用显式模板实例化的项目使用。 模板实例化文件可以存储在 Templates 子目录中,并使用此命令自动收集,以避免手动列出所有实例化。

示例:

aux_source_directory(. DIR_SRCS)

添加索引头文件的目录

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

例如

include_directories(${DIR})
include_directories("${PROJECT_ROOT_DIR}/inc")

生成可执行文件

add_executable(${PROJECT_NAME} *.cpp)
add_executable(${PROJECT_NAME} ${SOURCES})

生成静态库和动态库

ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)

类型有三种:

  • SHARED,动态库
  • STATIC,静态库
  • MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。

EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

示例:

add_library(StaticLib src/Main.cpp) # 默认情况下生成的是静态库
add_library(StaticLib STATIC src/Main.cpp)
add_library(ShareLib SHARED src/Main.cpp)

链接静态库和动态库

target_link_libraries(hello_binary PRIVATE StaticLib)

添加子工程同时把子工程所生成的静态库链接进来

add_subdirectory(sublibrary)
target_link_libraries(${PROJECT_NAME} sublibrary)

输出消息

MESSAGE(STATUS "Message")

set 变量

set(<variable> <value>
[[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])