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

时间:2019-03-04 15:11:50

标签: c++ c cmake

我需要在CMake文件的外部lib my中添加仅编译依赖关系-在问题的后面称为the_lib。所谓仅编译依赖性,是指传播编译时属性,最重要的是-I规则。

所讨论的库是使用add_library创建为库目标的。通常,我只会使用target_link_libraries(my_exec the_lib),但这会同时添加编译时属性和链接时属性,即,这会将-I-l/-L规则都添加到编译命令中,而我只需要{ {1}}。 (如果有人好奇我为什么需要这样的设置,这是原因。)

请注意,带有-I之类的target_include_directories(或类似效果的东西)对我不起作用,因为它不会添加lib所需的包含目录。我需要类似${the_lib_SOURCE_DIR}的地方,其中${the_lib_INCLUDE_DIRS}将被填充为the_lib_INCLUDE_DIRS所要求的-I规则-但我没有找到任何匹配的变量。

值得注意的是,我不能(或不应该)修改the_lib

1 个答案:

答案 0 :(得分:1)

  

我需要在CMake中向外部lib my添加仅编译依赖   文件

通过“外部”库,我要指的是不属于同一项目的一个库-一个未在与该项目相同的CMake构建系统范围内配置的库您要建立的目标。

  

[...]通常   依赖项添加了target_link_libraries(my_exec the_lib),   但这会增加编译时和链接时的依赖性。

不,不一定。就像在罐子上说的那样,这增​​加了链接依赖性,您可以将其视为-l选项。据我所知,它不会为外部库生成任何-I选项 ,否则会对外部库的编译阶段产生任何影响。类似地,据我所知,只有当添加的库是由同一构建系统配置和构建的另一个目标时,它才会传播任何形式的传递依赖项。也就是说,仅适用于内部库,而不适用于外部库。

  

请注意,target_include_directories带有类似   ${the_lib_SOURCE_DIR}(或类似的效果)不会   为我工作,因为它不会添加必要的包含目录   的lib。我需要类似${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-config条目中读取信息。
  • 使用与Python the_lib相似的python-config特有的技术。
  • 分析the_lib的标头以确定它们所依赖的外部软件包,并分别显式搜索这些软件包的标头。
  • 要求用户手动指定不在默认包含路径中的所有必需软件包。

CMake中没有魔术变量或函数可以自动收集此类信息,因为通常来说,the_lib的标头本身不提供该信息。还要注意,大多数依赖于the_lib的include依赖项,这些依赖项将安装在the_lib的预期构建时间的特定位置。很难保证。