C++ CMake依赖项与相同的头文件名冲突
我陷入了CMake依赖性问题。当我修改CXX头文件时,CMake不会重建程序 我的文件结构就是这样C++ CMake依赖项与相同的头文件名冲突,c++,cmake,C++,Cmake,我陷入了CMake依赖性问题。当我修改CXX头文件时,CMake不会重建程序 我的文件结构就是这样 $ tree . ├── a │ ├── a.h │ └── c.h ├── b │ ├── b.h │ └── c.h ├── CMakeLists.txt └── main.cxx 文件内容: a、 h b、 h main.cxx $ cat main.cxx #include "a/a.h" #include "b/b.h" int main() { } 内部的 $ ca
$ tree
.
├── a
│ ├── a.h
│ └── c.h
├── b
│ ├── b.h
│ └── c.h
├── CMakeLists.txt
└── main.cxx
文件内容:
a、 h
b、 h
main.cxx
$ cat main.cxx
#include "a/a.h"
#include "b/b.h"
int main()
{
}
内部的
$ 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不允许使用相同的头文件名吗?
尽管它可以重命名头文件。
但我想找到一个“正确”的方法来防止这种情况
提前感谢正如@MABVT在评论中指出的,CMake在这里是无关的:问题是关于适当的项目组织 从项目组织的角度来看,每个项目的标题可以分为两部分:
- 专用标题,仅用于编译项目本身
- 公共标题,外部世界(其他项目)使用这些标题
如您所见,在您的案例中,标题
a/a.h
和b/b.h
是公共的
但是对于标题a/c.h
和b/c.h
,您应该决定它们是公共的还是私有的
如果要将a/c.h
设为私有,则公共头a/a.h
不能包含它(规则2)
如果您想将
a/c.h
公开,则公共标题a/a.h
应使用其唯一名称将其包含在内,即#包含
(规则3)。也提供CMakeLists.txt
的内容。已添加。谢谢为什么需要两个同名的不同文件?无论CMake如何,都必须指定标题的完整路径,或者是绝对路径,或者是相对于注册的包含路径。。。如果没有指定任何包含目录,那么您只是在编写包含“c.h”
,它很可能是相对于CMakeLists.txt目录的。将#include“c.h”
更改为#在a.h和b.h中分别包含“a/c.h”
和b/c.h,并应同时出现。有两个子项目由不同的团队开发。我们很难防止头文件名冲突。
$ 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
$ cat CMakeLists.txt
add_executable(hello main.cxx)