跳转至

🔩 CMake

参考



安装



基础用法

Bash
1
rm -rf build/ && cmake -B build && cmake --build build/ -j20
  • 在顶层 CMakeLists.txt 目录中执行

  • cmake -B build

    • 生成构建系统文件(例如 Makefile),避免中间文件污染源代码目录(out-of-source)

    • -B 指定输出目录为 build

  • cmake --build build/ -j

    • 使用指定构建系统进行编译(例如 make

    • --build 指定构建目录为 build/

    • -j 多线程编译



调包侠

如同使用 g++ 编译项目一样,需要:

  • 指定需要编译的源文件

  • 头文件目录 target_include_directories

  • 链接库 target_link_libraries,相当于 -l,具体的库

时代的巨轮滚滚向前,网上的教程可以说是五花八门,这里通过四种情况分析

存在 .cmake

如果第三方库存在 .cmake 文件,不要犹豫,直接使用 find_package

CMake
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 设置 Qt 的 CMake 模块目录,如果不在 /usr/lib /usr/local/lib 等常见目录下
set(Qt6_DIR ".../Qt/x.y.z/gcc_64/lib/cmake/Qt6")

# 导入 Qt6 模块
# REQUIRED 必须找到
# COMPONENTS 需要的组件
find_package(Qt6 REQUIRED COMPONENTS
    Core
    Xml
)

# 链接
target_link_libraries(${PROJECT_NAME} PRIVATE
    Qt6::Core
    Qt6::Xml
)

存在 .pc

如果第三方库存在 .pc 文件,不要犹豫,优先使用 pkg_check_modules

CMake
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 导入 pkg-config 模块
find_package(PkgConfig REQUIRED)

# pkg_check_modules 在什么目录查找
set(ENV{PKG_CONFIG_PATH} ".../lib/pkgconfig")
pkg_check_modules(PQ REQUIRED IMPORTED_TARGET
    libpq
)

# 链接
target_link_libraries(${PROJECT_NAME} PRIVATE
    PkgConfig::PQ
)

手动

只给 includelib 目录

CMake
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 头文件目录
target_include_directories(${PROJECT_NAME} PRIVATE
    ${PROJECT_SOURCE_DIR}/libs/xxx/include
)

# 查找指定库
find_library(LIBQICSTABLE libqicstable.so.3 
    PATHS /home/jiao/Desktop/qicstable-master/lib
)

# 链接
target_link_libraries(${PROJECT_NAME} PRIVATE
    ${LIBQICSTABLE}
)

源码

项目和源码一起编

CMake
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 第三方库目录
add_subdirectory(subprocess)

# 生成可执行文件
add_executable(${PROJECT_NAME} 
    ${SOURCES}
)

# 头文件目录
target_include_directories(${PROJECT_NAME} PRIVATE
    ${PROJECT_SOURCE_DIR}/subprocess/src/cpp
)

# 链接
target_link_libraries(${PROJECT_NAME} PRIVATE
    subprocess
)



常见变量

变量名 说明
CMAKE_SOURCE_DIR 顶层 CMakeLists.txt 所在目录
CMAKE_CURRENT_SOURCE_DIR 当前 CMakeLists.txt 所在目录
CMAKE_BINARY_DIR 顶层 CMakeLists.txt 生成的构建目录
CMAKE_CURRENT_BINARY_DIR 当前 CMakeLists.txt 生成的构建目录



常用

add_library

CMake
1
2
add_library(util STATIC util.cpp)       # 生成静态库 libutil.a
add_library(util SHARED util.cpp)       # 生成动态库 libutil.so



ifelse

CMake
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
    set(LIB_PATH "/usr/local/xyz/lib")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
    set(LIB_PATH "C:/Path/To/Your/Libraries")
endif()

find_library(LIB_UTIL util 
    PATHS ${LIB_PATH}
)

target_link_libraries(${PROJECT_NAME} PRIVATE
    ${LIB_UTIL}
)