如何使用 cmake 添加仅编译依赖项
How add compile-only dependency with cmake
我需要在CMake文件中向外部库添加一个仅编译依赖项 - 在问题后面称为the_lib
。通过说仅编译依赖项,我的意思是传播编译时属性,最重要的是-I
规则。
有问题的库是使用add_library
创建为库目标的。通常我会简单地使用target_link_libraries(my_exec the_lib)
,但这同时添加了编译时和链接时属性,即,这会将-I
和-l/-L
规则添加到编译命令中,而我只需要-I
。(如果有人好奇为什么我需要这样的设置,这是因为原因。
请注意,target_include_directories
类似${the_lib_SOURCE_DIR}
(或任何类似效果的东西)对我不起作用,因为它不会添加库所需的包含目录。我需要类似${the_lib_INCLUDE_DIRS}
的东西,其中the_lib_INCLUDE_DIRS
将被填充为the_lib
要求的 -I 规则 - 但我没有找到任何与此匹配的变量。
值得注意的是,我不能(或不能)修改the_lib
。
我需要在 CMake 中添加一个仅编译依赖项到外部库 文件
通过"外部"库,我的意思是不属于同一项目的库 -即未在与您尝试构建的目标相同的CMake构建系统范围内配置
的库。[...]通常 依赖项是用
target_link_libraries(my_exec the_lib)
, 但这会增加编译时和链接时依赖项。
嗯,不,不一定。 正如锡上所说的那样,这增加了一个链接依赖关系,你可以把它看作是一个-l
选项。 据我所知,它不会为外部库生成任何-I
选项,也不会对外部库的编译阶段产生任何影响。 同样,据我所知,仅当添加的库是由同一构建系统配置和构建的另一个目标时,它才会传播任何类型的传递依赖项。 也就是说,仅适用于内部库,不适用于外部库。
请注意,
target_include_directories
类似的东西${the_lib_SOURCE_DIR}
(或类似效果的任何内容)不会 为我工作,因为它不会添加所需的包含目录 库。我需要类似${the_lib_INCLUDE_DIRS}
的东西the_lib_INCLUDE_DIRS
将填充为-I
规则要求the_lib
- 但我没有找到任何与之匹配的变量。
我认为您要求的是成功使用the_lib
的标头所必需的包含目录,在这些标头具有自己的外部依赖项的情况下。 您找不到适合该变量是有原因的:没有一致或标准的方式来获取外部库的信息。 可用的技术取决于the_lib
。 它们将包括以下一些(但可能不是全部)以下内容:
- 使用随
the_lib
提供的 CMake 宏或 CMake 本身来定义传达所需信息的 CMake 变量。 - 使用
pkg-config
从与the_lib
关联的 pkg 配置条目中读取信息。 - 使用一些技术特质来
the_lib
,沿着Python的python-config
线。 - 分析
the_lib
的标头以确定它们所依赖的外部包,并显式搜索这些包的标头。 - 要求用户手动指定不在默认包含路径中的任何必需包。
CMake 中没有魔术变量或函数来自动收集此类信息,因为一般来说,它无法从the_lib
的标头本身获得。 还要注意的是,其中大多数将取决于the_lib
包含依赖项安装在the_lib
构建时预期的特定位置。 这很难保证。
- GCC,CMake,预编译标头和维护依赖项
- 编译依赖于 QTCore 库的 WASM
- 更新 Visual Studio 2017,现在出现编译错误 C7510:"回调":使用依赖模板名称必须以 'template' 为前缀
- 在 Ubuntu 18.04 上,我编译的 cpp 可执行文件找不到 VTK7 依赖项
- 如何为在 x86 主机上为 arm 目标交叉编译的项目安装依赖项
- CMake:如何在Visual Studio环境中将依赖于模式的编译标志传递给nvcc
- 根据计算机上安装的库依赖项编译不同的代码
- 更改 Cmake 文件以从源代码编译依赖项,而不是使用 FIND_PACKAGE
- 在 NDK 上编译两个带有 gradle 的项目,其中一个依赖于另一个的二进制文件
- 如何 G++ 编译另一个目录中具有依赖项的.cpp文件
- CMake 使用设置编译依赖项
- C++ 生成文件不编译依赖项/链接错误?
- 是否可以编译具有在编译时无法解析的外部依赖项的静态库?
- 如何将所有依赖项和共享库编译为一个二进制文件
- 如何使用 cmake 添加仅编译依赖项
- C 项目依赖项无法在特定的MacOS框上编译
- 如何使用 cmake 编译依赖项
- 子类中的这种变化是否需要重新编译依赖于超类的代码?
- c++ makefile编译依赖库
- 有哪些技术可以限制C++项目中的编译依赖关系