每次添加新的源子文件夹时,Cmake都会重新编译所有内容

Cmake recompiles everything each time I add a new source subfolder

本文关键字:编译 新编译 Cmake 添加 文件夹      更新时间:2023-10-16

我有一个项目树,组织如下:

MyProjects/ - build - project1 - CMakeLists.txt
            |       | project2 - CMakeLists.txt
            |
            | src - project1 - Project1Class1.h
                             | Project1Class1.cpp
                             | Project1Class2.h
                             | Project1Class2.cpp
                             | more subdirectories ...
                    project2 - Project2Class1.h
                             | Project2Class1.cpp
                             | more subdirectories ...

想象一下,project2依赖于project1。然后project2直接使用project1文件,而不使用静态或动态的project1库。然后project2/CMakeLists.txt找到project1和project2源文件,并通过GLOB_RECURSE:将它们包括在内

file(
    GLOB_RECURSE
    source_files
    ../../project1/
    ../../project2/
)

这是工作的意义上,它正确地构建了我的项目。

每次我在新文件夹中添加一个新的源文件,例如src/project2/中的文件MyNewFolder/myTest.cpp,然后键入

~/MyProjects/build/project2/$  cmake .
~/MyProjects/build/project2/$  make

然后cmake会正确地考虑该文件。然而,我的问题是,每个文件都会被重新编译。

当我更改project1中的源文件并尝试编译project2时也是如此。

请注意,我大大简化了CMakeLists.txt中的实际内容。所以我的问题是:根据我对它的解释,这种行为是CMake应该做的吗?如果是的话,它背后的原理是什么?对于make,我应该如何只编译新文件?我在网上找不到任何关于它的文件。

注意:请随意讨论整个源代码构建文件组织。请注意,我希望将构建配置与src/文件夹分开。

编辑:我发现这解释了为什么GLOB和GLOB_RECURSE阻止它工作。

编辑2:即使没有GLOB,编译也是从一开始就完成的。在其他情况下(请参阅此问题)

您正在观察file(GLOB_RECURSE ...)的已知副作用。我不确定为什么会发生这种情况,但为了避免这种情况,大多数基于CMake的项目都明确列出了它们的来源:

set(source_files
  ../../project1/Project1Class1.cpp
  ../../project1/Project1Class2.cpp
  ...
  ../../project2/Project2Class1.cpp
  ../../project2/Project2Class1.cpp
  ...
)