如何解决在 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 举报,一经查实,本站将立刻删除。