CMake链接第三方库的方法
# CMake链接第三方库的方法
# 包含路径并链接
最直接的方法就是直接链接第三方库:
add_executable(main main.cpp)
target_link_libraries(main PUBLIC tbb)
如此,缺点过多:
CMake会在系统库目录里查找第三方库,对于没有固定库安装位置的Windows并不适用【当然可以通过写全tbb链接路径,但是不够优雅】:
target_link_libraries(main PUBLIC C:/Users/.../tbb/tbb.dll)
且这样做还要求库的头文件必须在系统默认的头文件目录里,若想不出错,需要再加
target_include_directories
命令设置额外的头文件查找目录。
# 使用find_package
命令(更加推荐)
find_package(TBB REQUIRED)
命令会查找TBBConfig.cmake
配置文件,并根据其配置信息创建伪对象TBB::tbb
指向真正的库文件路径;- 之后通过
target_link_libraries
链接TBB::tbb
就可以了。
add_executable(main main.cpp)
find_package(TBB REQUIRED)
target_link_libraries(main PUBLIC TBB::tbb)
TBB:tbb
除了会指向库文件路径之外,TBBConfig.cmake
还会添加一些PUBLIC
属性,用于让链接了他的对象带上一些flag之类的。例如在配置文件中使用了target_include_directories
命令包含了库头文件目录,并且链接了另外一个库,当main
链接了TBB::tbb
后会自动被传播库头文件目录,也会自动链接到另一个库,无需调用者手动添加库头文件或链接其他依赖库。
# Windows找不到包怎么办?
下面以Qt5
为例,Qt5Config.cmake
存放在路径 D:\Qt\5.15.2\msvc2019_64\lib\cmake\Qt5
下,下面对如何让CMake找到该文件进行说明演示。
# 设置 CMAKE_MODULE_PATH
变量
add_executable(main main.cpp)
# 注意使用 / 而非 \
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} D:/Qt/5.15.2/msvc2019_64/lib/cmake)
find_package(Qt5 REQUIRED COMPONENTS Widgets Gui REQUIRED)
target_link_libraries(main PUBLIC Qt5::Widgets Qt5::Gui)
# 设置 <包名>_DIR
变量指向 <包名>Config.cmake
所在位置
add_executable(main main.cpp)
# 设置 Qt5_DIR 这个变量为 D:/Qt/5.15.2/msvc2019_64/lib/cmake
set(Qt5_DIR D:/Qt/5.15.2/msvc2019_64/lib/cmake)
find_package(Qt5 REQUIRED COMPONENTS Widgets Gui REQUIRED)
target_link_libraries(main PUBLIC Qt5::Widgets Qt5::Gui)
# (推荐)直接在命令行通过 -DQt5_DIR="xxx" 指定
cmake -B build -DQt5_DIR="D:/Qt/5.15.2/msvc2019_64/lib/cmake"
# 设置环境变量 Qt5_DIR
设置变量Qt5_DIR="D:/Qt/5.15.2/msvc2019_64/lib/cmake"
# find_package
不指定 REQUIRED
时添加可选的依赖的小例子
add_executable(main main.cpp)
find_package(TBB)
if (TBB_FOUND)
message(STATUS "TBB found at: ${TBB_DIR}")
target_link_libraries(main PUBLIC TBB::tbb)
# 定义 WITH_TBB 宏
target_compile_definitions(main PUBLIC WITH_TBB)
else()
message(WARNING "TBB not found! using serial for")
endif()
- 找到了会把 TBB_FOUND 设为 TRUE,TBB_DIR 设为 TBBConfig.cmake 所在路径。
- 找不到会把 TBB_FOUND 设为 FALSE,TBB_DIR 为空。
如此在 main.cpp
中就可以实现依赖可选:
#include <cstdio>
#ifdef WITH_TBB
#include <tbb/parallel_for.h>
#endif
int main() {
#ifdef WITH_TBB
tbb::parallel_for(0, 4, [&] (int i) {
#else
for (int i = 0; i < 4; i++) {
#endif
printf("hello, %d!\n", i);
#ifdef WITH_TBB
});
#else
}
#endif
}
编辑 (opens new window)
上次更新: 2023/08/14, 19:51:00