我需要在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
。
答案 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条目中读取信息。the_lib
相似的python-config
特有的技术。the_lib
的标头以确定它们所依赖的外部软件包,并分别显式搜索这些软件包的标头。 CMake中没有魔术变量或函数可以自动收集此类信息,因为通常来说,the_lib
的标头本身不提供该信息。还要注意,大多数依赖于the_lib
的include依赖项,这些依赖项将安装在the_lib
的预期构建时间的特定位置。很难保证。