每次添加新的源子文件夹时,Cmake都会重新编译所有内容
Cmake recompiles everything each time I add a new source subfolder
我有一个项目树,组织如下:
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
...
)
相关文章:
- 使用 MINGW gcc 编译时,不会为 std::string 调用重载的新运算符
- 如何编译:Mac上的Synergy(2017年的新工具链)
- 如何编译和运行一个新的 C++ Actor 框架项目?
- C++编译新的警告过滤器
- 每次都构建(make)lib,只有在lib较新时才重新编译项目
- 如何创建指向派生类的新指针,该派生类在C++编译时未知
- 如何在不退出和失去断点的情况下重新加载重新编译的二进制文件
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- C++运算符新重载、编译错误
- 在新OSX上编译旧碳应用
- 为什么G 5.4不能编译此编译时质数代码
- 代码块在尝试编译或创建新文件时出现"An assertion failed!"错误
- 在新的Visual Studio项目中包含任何Eigen 3.3.1文件将无法编译
- RCpp:如何在不重新启动R的情况下重新加载重新编译的C++代码
- 新安装的MinGW问题与编译和可执行文件
- 为什么要编译?(编译是否忽略未包含的 h 文件?
- 高级C和C++编译:无法编译书中提到的示例程序
- 在不同的编译单元中使用不同的编译标志编译相同的头
- 在cygwin中编译新的mingw二进制文件
- 使用boost库编译预编译头文件需要很长时间