c++ - (target_)link_libraries 和 (target_)include_directories 之间的区别

标签 c++ cmake

<分区>

我正在努力处理一个使用 CMake 的大型 C++ 项目。 现在我正在尝试添加一个依赖项(一个预编译和安装的库),但我不确定要添加到哪里、要包含什么以及将它链接到哪里。

特别是,我想知道以下命令之间的区别:

  • include_directories
  • target_include_directories
  • link_libraries
  • target_link_libraries

此外,当我需要使用以下命令时:

  • find_package
  • add_library

我知道它与仅 header 库等有关,但我找不到可理解和简洁的解释。

此外,我应该如何处理以下情况:

包含的库需要例如 Boost,但核心项目不需要。如何避免膨胀整个 CMakeLists.txt 文件和二进制文件,并仍然使用预编译库? (我觉得这也是这个问题的一部分)

最佳答案

*include_directories 用于向编译器提供包含目录的列表。当使用预处理器包含文件时,将在这些目录中搜索该文件。

*link_libraries 用于向链接器提供库(对象存档)列表。如果链接项是 cmake 目标,具有指定的包含目录,则不需要使用 *include_directories 单独指定它们。

target_* 版本仅适用于作为操作数给出的目标。非目标版本适用于目录中的所有目标。应尽可能使用 target_* 版本(即几乎总是)。

find_package 用于从外部来源(即项目外部)搜索 cmake 设置。如果您想链接一个库而不在项目的子目录中包含库的源代码,那么您可以使用 find_package。从较低级别的角度来看,find_package(Foo) 查找一个 cmake 模块 FindFoo.cmake 并执行该模块。该模块的目的是生成可用于包含相应依赖项的 cmake 变量或目标。

add_library 类似于 add_executable,不同之处在于它添加了一个库目标,而不是一个可执行文件。库目标可以用作 link_libraries 中的项,它们的依赖项默认是可传递的。

I know it has something to do with header-only libraries and so on,

所有这些通常都与图书馆有关。除了*include_directories还用于指定项目自己的头文件的include目录,而不仅仅是库的头文件。


The included library requires for example Boost, but the core project not. How can I avoid bloating up the entire CMakeLists.txt file and the binaries, and still use the precompiled library?

如果 find_package 模块已经为库创建了一个 cmake 目标(使用 add_library(... IMPORTED)),它本身指定了依赖的依赖关系,那么只需使用 link_libraries 链接它,cmake 会负责与依赖项的链接。目标的包含目录也是如此。

旧的 cmake 模块不一定提供目标,在这种情况下,您可能需要编写自己的模块以避免项目配置膨胀。

关于c++ - (target_)link_libraries 和 (target_)include_directories 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565665/

相关文章:

c++ - 为什么 OpenSSL 会崩溃?

C++ 指针/for 循环混淆

regex - 如何在 CMake 中使用正则表达式的 {n} 语法

OpenCV编译错误Linking CXX共享库../../lib/libopencv_highgui.so/lib/libbz2.so.1 : could not read symbols: File in wrong format

c++ - 是否可以使用 cmake 为没有 pod 的 Xcode 11 链接 xcframework (FirebaseCore.xcframework)?我找不到例子

c++ - 使用 CMake 交叉编译 : linker errors

c++ - SOIL - 获取图像尺寸

c++ - Qt软件调试技巧

c++ - 基本类型是如何初始化的?

c++ - 无法使用 CMake 找到 Eigen3