<分区>
社区在 9 个月前 审查了是否重新打开此问题,然后将其关闭:
原始关闭原因未解决
我正在努力处理一个使用 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 模块不一定提供目标,在这种情况下,您可能需要编写自己的模块以避免项目配置膨胀。