CMake 指南
基本使用
第一个可运行的 C++ 程序
CMakeLists.txt 示例:
# 设置工程所需 CMake 的最低版本
cmake_minimum_required(VERSION 3.15)
# 定义工程名称
project(hello_cmake)
# 定义 C++ 语言标准为 C++ 14
set(CMAKE_CXX_STANDARD 14)
# 设置变量 SOURCE_FILES,值为 "main.cpp",多个文件用空格隔开
set(SOURCE_FILES main.cpp)
# 添加一个可执行目标:第一个参数定义生成的可执行文件的名称,第二个参数定义参与编译的所有源文件
# 其中 PROJECT_NAME 是 CMake 内置变量,即项目名称(由 project() 命令定义)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
输出自定义信息
message(STATUS "This is SOURCE dir: ${PROJECT_SOURCE_DIR}")
常用的输出级别:
FATAL_ERROR
: CMake Error, stop processing and generation.SEND_ERROR
: CMake Error, continue processing, but skip generation.WARNING
: CMake Warning, continue processing.DEPRECATION
: CMake Deprecation Error or Warning if variableCMAKE_ERROR_DEPRECATED
orCMAKE_WARN_DEPRECATED
is enabled, respectively, else no message.NOTICE
or (none) : Important message printed to stderr to attract user’s attention.STATUS
: The main interesting messages that project users might be interested in. Ideally these should be concise, no more than a single line, but still informative.
设置二进制文件输出目录
# 指定可执行目标生成路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
# 指定库文件的生成路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
构建库文件
add_library(mylib SHARED ${LIBRARY_SOURCE_FILES})
第一个参数指定库的名称。
第二个参数为 SHARED
构建动态库,为 STATIC
时构建静态库。
第三个参数为参与编译的源文件列表。
引用库
# 引入 libuv 库头文件的路径
target_include_directories(${PROJECT_NAME} PUBLIC /usr/local/Cellar/libuv/1.38.0/include)
# 引入 libuv 库文件所在的路径
target_link_directories(${PROJECT_NAME} PUBLIC /usr/local/Cellar/libuv/1.38.0/lib)
# 指定链接库的名称,以链接到可执行文件
target_link_libraries(${PROJECT_NAME} uv)
进阶
为项目添加子目录
# 用于识别子目录的 CMake 工程
add_subdirectory(dir)
编译时定义宏
# 定义 WIN32 宏
add_compile_definitions(WIN32)
以控制下面的代码的编译行为:
#include <iostream>
int main(int argc, char *argv[]) {
#ifdef WIN32
std::cout << "windows" << std::endl;
#endif
return 0;
}