【问题标题】:Difference between (target_)link_libraries and (target_)include_directories [closed](target_)link_libraries 和 (target_)include_directories 之间的区别[关闭]
【发布时间】:2019-10-27 04:08:19
【问题描述】:

我正在为一个使用 CMake 的大型 C++ 项目而苦苦挣扎。 现在我正在尝试添加一个依赖项(一个预编译和安装的库),但我不确定添加的位置、包含的内容以及链接的位置。

特别想知道以下命令的区别:

  • include_directories
  • target_include_directories
  • link_libraries
  • target_link_libraries

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

  • find_package
  • add_library

我知道它与仅标头库等有关,但我找不到易于理解和简洁的解释。

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

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

【问题讨论】:

标签: c++ cmake


【解决方案1】:

*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中的项目使用,它们的依赖默认是传递的。

我知道这与仅标头库等有关,

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


包含的库需要例如 Boost,但核心项目不需要。如何避免膨胀整个 CMakeLists.txt 文件和二进制文件,并且仍然使用预编译库?

如果 find_package 模块为库创建了一个 cmake 目标(使用 add_library(... IMPORTED)),它本身指定依赖项的依赖关系,然后使用 link_libraries 简单地链接它,然后 cmake负责与依赖项的链接。目标的包含目录也是如此。

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

【讨论】:

  • 次要附录:find_package(Foo) 也可以使用位于 /usr/lib/cmake/Foo/FooConfig.cmake 等位置的文件 - 此类文件通常由外部包提供,而不是由项目提供的 FindFoo.cmake
猜你喜欢
  • 2012-09-27
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2014-11-28
  • 2016-08-01
  • 2011-10-07
  • 2012-01-12
相关资源
最近更新 更多