CMake依赖冲突与相同的头文件名

时间:2017-06-05 07:15:03

标签: c++ cmake

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

我的文件结构是这样的

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

文件内容:

A.H

$ 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 depend.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不允许使用相同的头文件名吗? 尽管它可以重命名头文件。 但我想找到一个正确的"防止这种情况的方法。

提前致谢

1 个答案:

答案 0 :(得分:1)

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

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

  • 私有标题,仅用于编译项目本身,

  • 公开标题,由外部世界使用(由其他项目使用)。

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

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

  1. 所有项目中公共标题的名称应为唯一

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

  2. 公开标题不应包含 私有标题

  3. 公共标题应包含其他公开标题,仅使用其唯一名称

  4. 正如您所看到的,标题a/a.hb/b.h在您的案例中公开

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

    如果您想a/c.h 私有,则 public 标题a/a.h不能包含它(规则2)。

    如果您想a/c.h 公开,那么公开标题a/a.h应该使用唯一名称来包含它,即{{1 (规则3)。