(target_)link_libraries和(target_)include_directories之间的区别

时间:2019-06-12 15:25:10

标签: c++ cmake

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

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

  • include_directories
  • target_include_directories
  • link_libraries
  • target_link_libraries

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

  • find_package
  • add_library

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

  

我知道它与仅标头库等有关

所有这些一般都与库有关。 *include_directories除用于指定项目自己的头文件的包含目录外,还用于指定库的头文件。


  

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

如果,find_package模块已为库创建了cmake目标(使用add_library(... IMPORTED)),该目标本身指定了依赖关系的依赖关系,则只需使用{{1}与其进行链接},而cmake负责与依赖项的链接。目标的包含目录也是如此。

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