CMake 指南

675 阅读1分钟

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 variable CMAKE_ERROR_DEPRECATED or CMAKE_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;
}