我陷入了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不允许使用相同的头文件名吗? 尽管它可以重命名头文件。 但我想找到一个正确的"防止这种情况的方法。
提前致谢
答案 0 :(得分:1)
正如@MABVT在评论中指出的那样,CMake在这里是无关的:问题是关于正确的项目'组织。
从项目的角度来看'组织,每个项目的标题可以分为两部分:
私有标题,仅用于编译项目本身,
公开标题,由外部世界使用(由其他项目使用)。
私有标题的命名和组织完全取决于项目的作者。
但对于可扩展项目,公共标题的命名和组织应遵循以下几条规则:
所有项目中公共标题的名称应为唯一。
通常可以通过将这些标题移动到包含项目名称的目录中来实现。
公开标题不应包含 私有标题。
公共标题应包含其他公开标题,仅使用其唯一名称。
正如您所看到的,标题a/a.h
和b/b.h
在您的案例中公开。
但对于标题a/c.h
和b/c.h
,您应该决定是 public 还是 private 。
如果您想a/c.h
私有,则 public 标题a/a.h
不能包含它(规则2)。
如果您想a/c.h
公开,那么公开标题a/a.h
应该使用唯一名称来包含它,即{{1 (规则3)。