Sirius' blog Sirius' blog
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Sirius0v0

怕什么真理无穷,进一寸有一寸的欢喜
首页
  • 学习笔记

    • 《C++》
    • 《MATLAB》
    • 《Python》
  • 学习笔记

    • 《Git》
    • 《CMake》
  • 技术文档
  • 博客搭建
  • 学习
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 初识CMake:学习笔记与速查
  • CMake中常见的内置变量
  • 现代CMake命令行及CMakeLists.txt写法
  • CMake设置对象属性
  • CMake链接第三方库的方法
    • 包含路径并链接
    • 使用find_package命令(更加推荐)
      • Windows找不到包怎么办?
      • find_package 不指定 REQUIRED 时添加可选的依赖的小例子
  • 使用CMake模块化项目
  • 《CMake》学习笔记
Sirius0v0
2023-08-11
目录

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命令(更加推荐)

  1. find_package(TBB REQUIRED) 命令会查找 TBBConfig.cmake 配置文件,并根据其配置信息创建伪对象 TBB::tbb 指向真正的库文件路径;
  2. 之后通过 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)
#CMake
上次更新: 2023/08/14, 19:51:00
CMake设置对象属性
使用CMake模块化项目

← CMake设置对象属性 使用CMake模块化项目→

最近更新
01
ipopt优化库配置及使用
07-21
02
ubuntu离线安装包的方法
07-21
03
其它控件的使用
03-05
更多文章>
Theme by Vdoing | Copyright © 2020-2024 Sirius0v0 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式