我有一个项目树,如下所示:
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 /文件夹分开。
编辑:我发现this解释了为什么GLOB和GLOB_RECURSE阻止它起作用。
编辑2:即使没有GLOB,编译也是从其他情况开始的(参见this问题)
答案 0 :(得分:3)
您正在观察file(GLOB_RECURSE ...)
的已知副作用。我不确定为什么会发生这种情况,但为了避免这种情况,大多数基于CMake的项目明确地列出了它们的来源:
set(source_files
../../project1/Project1Class1.cpp
../../project1/Project1Class2.cpp
...
../../project2/Project2Class1.cpp
../../project2/Project2Class1.cpp
...
)