(target_)link_libraries 和 (target_)include_directories之间的区别
Difference between (target_)link_libraries and (target_)include_directories
我正在努力处理一个使用 CMake 的大型C++项目。 现在我正在尝试添加一个依赖项(一个预编译和安装的库),但我不确定在哪里添加,要包含什么以及在哪里链接它。
特别是,我想知道以下命令之间的区别:
include_directories
target_include_directories
link_libraries
target_link_libraries
另外,当我需要使用以下命令时:
find_package
和add_library
我知道它与仅标题库等有关,但我找不到可理解且精简的解释。
另外,我应该如何处理以下情况:
例如,包含的库需要 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
中的项目,并且默认情况下它们的依赖关系是可传递的。
我知道它与仅标题库等有关,
所有这些都与一般的图书馆有关。除了*include_directories
还用于指定项目自己的头文件的包含目录,而不仅仅是库的包含目录。
例如
,包含的库需要 Boost,但核心项目不需要。如何避免使整个 CMakeLists.txt 文件和二进制文件膨胀,同时仍然使用预编译库?
如果find_package模块为库创建了一个 cmake 目标(使用add_library(... IMPORTED)
),它本身指定了依赖项的依赖项,则只需使用link_libraries
与它链接,cmake 就会负责与依赖项的链接。目标的包含目录也是如此。
旧的 cmake 模块不一定提供目标,在这种情况下,您可能需要编写自己的模块以避免项目配置膨胀。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 构造函数和转换运算符之间的重载解析
- 如何获取字符*的实际长度?strlen 和 sizeof(target)/sizeof(target*)之间的区别?