如何避免 cmake 子项目中的名称冲突?

Posted

技术标签:

【中文标题】如何避免 cmake 子项目中的名称冲突?【英文标题】:How to avoid name ***es in cmake subprojects? 【发布时间】:2015-06-05 13:25:20 【问题描述】:

所以我设置了一个元项目,这意味着我有一个包含多个子目录的目录(根目录),每个子目录都是一个 cmake 项目(具有有效的 cmakelists)。根目录下的 cmakelists 使用 cmake add_subdirectory 命令导入子项目。

每个子项目都定义了自己的目标(库和可执行文件)以及为该项目执行测试套件的目标“检查”和运行 doxygen 的“文档”。

我的问题是 CMake 不明白 check 和 docs 目标是每个项目的本地目标,因此抱怨名称冲突。

所以我的问题是,有没有办法让 cmake 了解这些目标是每个项目的本地目标?

【问题讨论】:

【参考方案1】:

CMake 不允许重复的目标名称。 docs for policy CMP0002 中提供了理由:

可以在 CMake 中明确引用唯一名称 代码和制作工具命令行。 Xcode 和 VS IDE 生成器使用逻辑名称 为目标生成有意义的项目名称。

您可以尝试将 CMP0002 设置为 OLD(通过 cmake_policy(SET CMP0002 OLD) 完成),这至少可以消除 CMake 错误,但我不建议这样做 - 它肯定不适用于 MSVC/Xcode .

我能看到的唯一没有手动编码唯一名称的选项是编写一个 CMake 函数,它为每个“检查”目标生成一个唯一名称 - 例如,它可以附加正在检查的目标的名称,从而产生check_my_lib_onecheck_my_exe_one 等名称。

此函数还可用于收集所有已注册check_<Target> 实例的列表,并将它们添加到名为check 的单个目标中,该目标将调用每个从属check_<Target>,因此运行make check 会运行它们。

【讨论】:

嗯,我一直在寻找类似“每个项目一个命名空间”的解决方案,但在 cmake 中似乎不存在,所以我将使用您的解决方案,谢谢! @Abstract-Sky 从技术上讲,您可以自己使用命名空间约定。例如,以项目名称为项目的所有目标添加前缀。 @ibizaman 这就是我最终做的事情,使用宏自动添加前缀。 是否有非自动前缀可以启用而无需重命名?

以上是关于如何避免 cmake 子项目中的名称冲突?的主要内容,如果未能解决你的问题,请参考以下文章

CMake:如何避免 HDF5 系统和 conda 安装中的不匹配?

CMake 为 VS 项目生成循环依赖,但不生成文件。如何避免?

C# cmake 构建中的 XAML 文件冲突

如何解决 Cocoa touch 框架中的符号名称冲突

如何避免 Python 模块系统中的命名冲突?

makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)