C++ 如何使用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目录,类似

我需要在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\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的人都可以理解的