Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake依赖项与相同的头文件名冲突_C++_Cmake - Fatal编程技术网

C++ 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

我陷入了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()
{
}
内部的

$ 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)