gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:19:03 24 4
gpt4 key购买 nike

我的项目树结构如下:

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 只编译新文件?我无法在 Internet 上找到有关它的任何文档。

注意:请随意讨论整体源构建文件组织。请注意,我想将构建配置与 src/文件夹分开。

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

编辑 2:即使没有 GLOB,在其他情况下编译也是从头开始的(参见 this 问题)

最佳答案

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

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

关于c++ - 每次我添加新的源子文件夹时,Cmake 都会重新编译所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com