C++ 如何使用cmake添加仅编译依赖项
我需要在CMake文件中的外部库中添加一个仅编译的依赖项-在问题的后面称为C++ 如何使用cmake添加仅编译依赖项,c++,c,cmake,C++,C,Cmake,我需要在CMake文件中的外部库中添加一个仅编译的依赖项-在问题的后面称为the_-lib。我所说的仅编译依赖性是指传播编译时属性,最重要的是-I规则 使用add\u library将有问题的库创建为库目标。通常我会简单地使用target\u link\u库(my_exec the_lib),但这会同时添加编译时和链接时属性,即,这会将-I和-l/-l规则添加到编译命令中,而我只需要-I。(如果有人好奇我为什么需要这样的设置,这是因为原因) 请注意,target\u include\u目录,类似
the_-lib
。我所说的仅编译依赖性是指传播编译时属性,最重要的是-I
规则
使用add\u library
将有问题的库创建为库目标。通常我会简单地使用target\u link\u库(my_exec the_lib)
,但这会同时添加编译时和链接时属性,即,这会将-I
和-l/-l
规则添加到编译命令中,而我只需要-I
。(如果有人好奇我为什么需要这样的设置,这是因为原因)
请注意,target\u include\u目录
,类似于${the_lib\u SOURCE\u DIR}
(或类似效果的任何东西)对我不起作用,因为它不会添加库所需的include目录。我需要像${the_lib_INCLUDE_DIRS}
这样的东西,其中the_lib_INCLUDE_DIRS
将填充为the_lib
所需的as-I规则,但我没有找到任何与之匹配的变量
值得注意的是,我不能(或不愿意)修改库
我需要在CMake中向外部库添加一个仅编译依赖项
文件
通过“外部”库,我认为您指的是不属于同一项目的库,即不在与您尝试构建的目标相同的CMake构建系统范围内配置的库
[……]通常
依赖项是通过目标链接库(my_exec the_lib)
添加的,
但这同时增加了编译时和链接时依赖性
不,不一定。正如tin上所说,这增加了一个链接依赖项,您可以将其视为一个-l
选项。据我所知,它不会为外部库生成任何-I
选项,也不会对外部库的编译阶段产生任何影响。类似地,据我所知,只有当添加的库是由同一构建系统配置和构建的另一个目标时,它才会传播任何类型的可传递依赖项。也就是说,仅适用于内部库,而不适用于外部库
请注意,target\u包括\u目录
${u lib_SOURCE_DIR}
(或类似效果的任何东西)不会
为我工作,因为它不会添加
自由党。我需要像${the_lib_INCLUDE_DIRS}
这样的东西
库包含目录将填充为所需的as-I
规则
库
——但我没有找到任何与之匹配的变量
我认为您要求的是include目录,在这些头具有自己的外部依赖性的情况下,成功使用库的头是必要的。您找不到一个适合于此的变量是有原因的:没有一致或标准的方法来获取外部库的信息。可用的技术取决于库
。它们将包括以下部分,但可能不是全部:
- 使用随库提供的CMake宏或CMake本身来定义传递所需信息的CMake变量
- 使用
pkg config
从与库关联的pkg config条目中读取信息
- 按照Python的
Python配置
的思路,使用一些技术特性来库
- 分析库的头文件,以确定它们所依赖的外部包,并分别明确搜索这些包的头文件
- 要求用户手动指定不在默认包含路径中的任何所需包
CMake中没有神奇的变量或函数可以自动收集此类信息,因为一般来说,它不能从库的头文件本身获得。还要注意的是,大多数依赖于库的依赖项包括在库构建时预期的特定位置安装的依赖项。这很难保证。这是错误的target\u link\u库
确实为编译命令添加了-I规则。@SergeyA,我已经澄清,我主要谈论的是将target\u link\u库
与外部库结合使用。这都是关于CMake实际可用的信息,对于外部依赖项,CMake可以自动确定的宝贵信息很少,除非您将诸如我列表中的第一对这样的机制的使用计算在内。似乎您混淆了依赖项和(自动传播的)属性。“依赖项”意味着库应该在可执行文件之前构建(不管这意味着什么)。添加依赖项最直接的方法是add_dependencies
命令,它在目标之间(例如,在库和可执行文件之间)创建依赖项。您谈到了目标链接库
,但其主要目的是传播属性:链接库文件,包括目录,添加编译标志,等等。那么,你到底想要什么,依赖还是属性传播?@Tsyvarev我可能对CMake行话不是很精通。我想知道target\u link\u library
对我的编译标志有什么影响,但对我的链接标志没有影响。因此,如果它被称为“属性传播”,这就是我想要的。好吧,这个两行的评论比你的整个问题帖子更好地解释了你的需求。顺便说一句,如果你不精通一些语言术语,那么。。。只需提供一个代码:这是任何熟悉w的人都可以理解的