代码之家  ›  专栏  ›  技术社区  ›  SergeyA

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

  •  1
  • SergeyA  · 技术社区  · 6 年前

    我需要向cmake文件中的外部lib my添加一个只编译的依赖项-称为 the_lib 在后面的问题中。我说的只编译依赖是指传播编译时属性,最重要的是 -I 规则。

    使用 add_library . 通常我只会用 target_link_libraries(my_exec the_lib) ,但这会同时添加编译时和链接时属性,即,这会同时添加 -我 -l/-L 编译命令的规则,而我只需要 -我 . (如果有人是古董,为什么我需要这样的设置,这是 因为原因 )

    请注意, target_include_directories 有点像 ${the_lib_SOURCE_DIR} (或类似效果的任何东西)对我都不起作用,因为它不会添加lib所需的include目录。我需要一些像 ${the_lib_INCLUDE_DIRS} 哪里 the_lib_INCLUDE_DIRS 将填充为 西里伯 -但我没有找到任何与之匹配的变量。

    值得注意的是,我不能(或不)修改 西里伯 .

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Bollinger    6 年前

    我需要在cmake中向外部lib my添加一个只编译的依赖项 文件

    我认为“外部”库是指不属于同一项目的库-- 未在与您尝试生成的目标相同的cmake生成系统范围内配置的。

    […]正常 依赖项与 target_link_libraries(my_exec the_lib) , 但这同时增加了编译时间和链接时间依赖性。

    不,不一定。正如在TiN上所说的,它增加了一个链接依赖关系,你可以把它看作是一个链接。 -l 选择权。据我所知,它不会产生任何 -I 选项 对于外部库 ,或对外部库的编译阶段有任何影响。同样,据我所知,它只在添加的库是由同一构建系统配置和构建的另一个目标时传播任何类型的可传递依赖项。也就是说,只针对内部库,而不是外部库。

    请注意, target_include_directories 有点像 ${the_lib_SOURCE_DIR} (或类似的东西)不会 为我工作,因为它不会添加 解放军。我需要一些像 ${the_lib_INCLUDE_DIRS} 哪里 the_lib_INCLUDE_DIRS 将填充为 -我 要求的规则 the_lib -但我没有找到任何与之匹配的变量。

    我想你要的是成功使用所需的include目录 西里伯 的头,在这些头有自己的外部依赖项的情况下。为什么找不到适合的变量:没有一致或标准的方法为外部库获取这些信息。可用的技术取决于 西里伯 . 它们将包括 一些 但可能不是全部:

    • 使用随附的cmake宏 西里伯 或者用cmake本身来定义一个传递所需信息的cmake变量。
    • 使用 pkg-config 从与 西里伯 .
    • 使用一些特殊的技术 西里伯 ,沿着python的路线 python-config .
    • 分析 西里伯 的头以确定它们所依赖的外部包,并显式地分别搜索这些包的头。
    • 要求用户为任何不在默认包含路径中的必需包手动指定。

    cmake中没有自动收集此类信息的神奇变量或函数,因为一般来说,它不可从 西里伯 的标题本身。也要注意的是,其中的大部分将取决于 西里伯 包括在预期的特定位置安装的依赖项 西里伯 的生成时间。这很难保证。