🔩 CMake
参考
安装
-
sudo apt install cmake
-
从源码安装
基础用法
Bash |
---|
| rm -rf build/ && cmake -B build && cmake --build build/ -j20
|
-
在顶层 CMakeLists.txt
目录中执行
-
cmake -B build
-
cmake --build build/ -j
-
使用指定构建系统进行编译(例如 make
)
-
--build
指定构建目录为 build/
-
-j
多线程编译
调包侠
如同使用 g++
编译项目一样,需要:
时代的巨轮滚滚向前,网上的教程可以说是五花八门,这里通过四种情况分析
存在 .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
)
|
手动
只给 include
和 lib
目录
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 |
---|
| 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}
)
|