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依赖。内部

$ 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不允许相同的标头文件名称?Altough它可以重命名标头文件。但是我想找到一种防止这种方法的"正确"方法。

预先感谢

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

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

  • 私人标头,仅用于编译项目本身,

  • 公共标头,由外界使用(其他项目(。

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

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

  1. 公共标题的名称应为 unique 所有项目

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

  2. 公共头不应包括私人标头

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


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

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

如果要制作a/c.h 私有,则 public header a/a.h不能包括它(规则2(。

如果要制作a/c.h public ,则公共标题a/a.h应使用其 unique name ,即#include <a/c.h>(规则3(。

<</p>

这似乎是 make 的功能。如@tsyvarev所述,在#include语句中添加子目录名称help make 找到正确的依赖项,但在源代码中看起来很尴尬。

ninja 正确确定上面情况下的依赖项。与 cmake install ninja 一起使用,然后使用...

选择它
cmake -G Ninja

最新更新