如何使用 cmake 添加仅编译依赖项

How add compile-only dependency with cmake

本文关键字:编译 依赖 添加 何使用 cmake      更新时间:2023-10-16

我需要在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构建时预期的特定位置。 这很难保证。