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

如何避免cmake子项目中的名称冲突?,cmake,Cmake,因此,我设置了一个元项目,这意味着我有一个目录(根目录),其中包含多个子目录,每个子目录都是一个cmake项目(具有有效的cmakelists)。根目录中的cmakelists使用cmake add_子目录命令导入子项目 每个子项目定义自己的目标(库和可执行文件),以及执行该项目测试套件的目标“检查”和运行doxygen的目标“文档” 我的问题是,CMake不理解检查和文档目标是每个项目的本地目标,因此会抱怨名称冲突 所以我的问题是,有没有办法让cmake明白这些目标是每个项目的局部目标 CMa

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

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

我的问题是,CMake不理解检查和文档目标是每个项目的本地目标,因此会抱怨名称冲突


所以我的问题是,有没有办法让cmake明白这些目标是每个项目的局部目标

CMake不允许重复的目标名称。基本原理见以下文件:

  • 在CMake和CMake中都可以明确引用唯一的名称 代码和“生成工具”命令行上的
  • 逻辑名称由Xcode和VS IDE生成器使用 为目标生成有意义的项目名称
您可以尝试将
cmp002
设置为
OLD
(通过
cmake_策略(将cmp002设置为OLD)
完成),这至少可以消除cmake错误,但我建议不要这样做-它肯定不适用于MSVC/Xcode

除了手工编码唯一名称之外,我能看到的唯一选项是编写一个CMake函数,该函数为每个“检查”目标生成一个唯一的名称——例如,它可以附加正在检查的目标的名称,产生诸如
检查我的库一
检查我的执行库一
等名称


这个函数还可以用来收集所有已注册的
check
实例的列表,并将它们添加到一个名为
check
的单一目标中,该目标将调用每个下属
check
,因此运行
make check
可以运行所有实例。

嗯,我正在寻找类似“每个项目一个名称空间”的东西这是一种解决方案,但在cmake中似乎不存在,所以我将使用您的解决方案,谢谢@从技术上讲,您可以自己使用名称空间约定。例如,用项目名称作为项目所有目标的前缀。@ibizaman我就是这样做的,使用宏自动添加前缀。是否有无需重命名任何内容即可启用的非自动前缀?