(目标)链接库和(目标)包含目录之间的区别 我正在与一个使用CMake的大型C++项目进行斗争。 现在我试图添加一个依赖项(一个预编译和安装的库),但我不确定要添加到哪里、包含什么以及链接到哪里

(目标)链接库和(目标)包含目录之间的区别 我正在与一个使用CMake的大型C++项目进行斗争。 现在我试图添加一个依赖项(一个预编译和安装的库),但我不确定要添加到哪里、包含什么以及链接到哪里,c++,cmake,C++,Cmake,特别是,我想知道以下命令之间的区别: 包括目录 target\u包含目录 链接库 目标链接库 另外,当我需要使用以下命令时: 查找包和 添加库 我知道这与只使用标题的库等有关,但我找不到一个可理解且简明的解释 另外,我应该如何处理以下情况: 包含的库需要例如Boost,但核心项目不需要。如何避免使整个CMakeLists.txt文件和二进制文件膨胀,而仍然使用预编译库?(我认为这也是这个问题的一部分)*include_目录用于向编译器提供包含目录的列表。当使用预处理器包含文件时,将在这些

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

  • 包括目录
  • target\u包含目录
  • 链接库
  • 目标链接库
另外,当我需要使用以下命令时:

  • 查找包
  • 添加库
我知道这与只使用标题的库等有关,但我找不到一个可理解且简明的解释

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


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

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

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

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

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

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

我知道这和只包含标题的库有关等等

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


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

如果find_package模块为库创建了一个cmake目标(使用
add_library(…IMPORTED)
),该目标本身指定依赖项的依赖项,那么只需使用
link_libraries
与之链接,cmake就会负责与依赖项的链接。目标的include目录也是如此


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

次要附录:
find\u package(Foo)
也可以在
/usr/lib/cmake/Foo/FooConfig.cmake
等位置使用文件-这些文件通常由外部包提供,而不是由项目提供的
FindFoo.cmake
。单个帖子中的问题太多。例如,
include\u目录
target\u include\u目录
之间的区别可以在该问题中找到: