微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 cmake 中更改导出的目标名称为目标安装别名

如何解决在 cmake 中更改导出的目标名称为目标安装别名

我有一个由许多较小的子项目组成的项目。为了便于使用,我们将所有内容都构建为一个大项目——每个子项目都是 add_subdirectory。这样所有目标都是可见的,我们可以使用 EXCLUDE_FROM_ALL 并只构建必要的依赖项,它大大缩短了构建时间。另一方面,可以将其中一些子项目作为另一个项目的平台排除在外。在这种情况下,我们希望安装必要的目标。棘手的部分来了。目标名称在整个 cmake 调用中必须是唯一的,因此目标名称往往是 component_subcomponent_module。另一方面,当我们导出它们时,使用命名空间 component::subcomponent 是有意义的。这里有一个问题,它仍然需要使用目标名称,因此用户必须使用 component::subcomponent::component_subcomponent_module。有没有办法支持包含和导入项目以及使用命名空间名称?我想将 component_subcomponent_module 导出为 component::subcomponent 命名空间中的模块。我知道我可以在项目中创建这样的别名,但我找不到任何方法来更改(别名)导出的名称

add_library(component_subcomponent_mocks ...)
install(
    TARGETS component_subcomponent_mocks
    EXPORT FindComponentSubcomponentMocks
    ARCHIVE DESTINATION lib
    PUBLIC_HEADER DESTINATION include
)
install(
    EXPORT FindComponentSubcomponentMocks
    NAMESPACE component::subcomponent
    DESTINATION cmake
)

你看它去哪里了,导入的名字会变成component::subcomponent::component_subcomponent_mocks。 另一方面,我不能只创建:

add_library(mocks ...)
install(
    TARGETS mocks
    ...
}

如果我这样做,那么使用 add_subdirectory 添加子项目最终会导致项目名称冲突。一种选择是根本不使用命名空间。如果它在整个项目中已经是唯一的,那么添加命名空间有什么意义呢?我不喜欢这个主意,但这就是它的全部目的。

我见过这样的解决方案:Cmake: Exporting targets with the same name in the build tree 这根本不能解决我的问题。我可以这样配置它,但使用子项目的全部目的是避免实现额外的依赖跟踪层。要么我们必须在继续构建之前对每个(数百个)依赖项调用 make && make install ,要么我们必须相信它们都没有改变,这会导致许多错误。对于导入的项目,我们使用这种方法,它工作正常,但不必要地慢。只需在它们中的每一个上运行 cmake 以在发生更改时更新它们就需要几分钟。所有这些都需要 10 秒运行您当前正在开发的测试。这就是为什么我们必须支持将子项目添加为子目录的原因。

据我所知,最简单的解决方案是将目标安装为别名,但认情况下没有这样的选项。例如:

install(
    TARGETS component_subcomponent_mocks
    EXPORT FindComponentSubcomponentMocks
    ...
)
install(
    EXPORT FindComponentSubcomponentMocks
    NAMESPACE component::subcomponent
    ALIAS mocks
    ...

这种方式安装的目标将是 component::subcomponent::mocks,而 add_subdirectory 使用的目标将是 component_subcomponent_mocks,我可以轻松地将其别名为相同的命名空间版本。除了认情况下不支持之外,一切都会整洁一致。有什么替代方法吗?

有类似但不详细的问题,都没有特定的答案。 Change name of exported target cmake install xxxTargets.cmake with a different name from the original target

整个问题是我必须保持目标名称的唯一性,因此它们已经在名称中包含了他们的“命名空间”,而再次包含它似乎毫无意义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?