【问题标题】:CMake dependency conflict with same header file namesCMake依赖冲突与相同的头文件名
【发布时间】:2017-06-05 07:15:03
【问题描述】:

我陷入了 CMake 依赖问题。当我修改 CXX 头文件时,CMake 没有重建程序。

我的文件结构是这样的

$ tree
.
├── a
│   ├── a.h
│   └── c.h
├── b
│   ├── b.h
│   └── c.h
├── CMakeLists.txt
└── main.cxx

文件内容:

啊。

$ cat a/a.h
#include "c.h"

b.h

$ cat b/b.h
#include "c.h"

main.cxx

$ cat main.cxx
#include "a/a.h"
#include "b/b.h"
int main()
{
}

CMake 依赖.internal

$ cat CMakeFiles/hello.dir/depend.internal
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.7

CMakeFiles/hello.dir/main.cxx.o
 /proj/mtk09331/work/tmp/cmake/a/a.h
 /proj/mtk09331/work/tmp/cmake/a/c.h
 /proj/mtk09331/work/tmp/cmake/b/b.h
 /proj/mtk09331/work/tmp/cmake/main.cxx

CMakeLists.txt:

$ cat CMakeLists.txt
add_executable(hello main.cxx)

如您所见,依赖列表中不存在 b/c.h。 因此,如果我修改了 b/c.h,CMake 将不会重建程序。

cmake 不允许使用相同的头文件名吗? 尽管它适用于重命名头文件。 但我想找到一种“正确”的方法来防止这种情况发生。

提前致谢

【问题讨论】:

  • 也提供CMakeLists.txt的内容。
  • 已添加。谢谢!
  • 为什么需要两个同名的不同文件?
  • 不管 CMake 是什么,您都必须指定标头的完整路径,可以是绝对路径,也可以是相对于已注册的包含路径...您只是在写 #include "c.h",这很可能是相对的到 CMakeLists.txt 的目录,如果你没有指定任何include_directories。将 a.h 和 b.h 中的 #include "c.h" 分别更改为 #include "a/c.h" 和 b/c.h,两者都应该出现。
  • 有两个不同团队开发的子项目。我们很难防止头文件名冲突。

标签: c++ cmake


【解决方案1】:

正如@MABVT 在评论中指出的那样,CMake 与这里无关:问题是关于适当的项目组织。

从项目组织的角度来看,每个项目的标头可以分为两部分:

  • 私有头文件,仅用于编译项目本身,

  • 公共标头,供外部世界(其他项目)使用。

私有标头的命名和组织完全取决于项目的作者。

但对于可扩展项目,公共标头的命名和组织应遵循以下规则:

  1. 公共标头的名称应在所有项目唯一

    通常这是通过将这些标题移动到包含项目名称的目录中来实现的。

  2. 公共标头不应包含 私有标头

  3. 公共标头应包括仅使用其唯一名称的其他公共标头。


如您所见,标题 a/a.hb/b.h 在您的情况下是 public

但是对于标题 a/c.hb/c.h,您应该决定它们是 public 还是 private

如果你想将a/c.h设为private,那么public标头a/a.h不能包含它(规则2)。

如果你想让a/c.h public,那么公共标头a/a.h 应该使用它的唯一名称 包含它,即#include <a/c.h>(规则3) .

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2018-10-24
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2017-10-15
    • 2019-08-08
    • 2013-07-25
    相关资源
    最近更新 更多