【发布时间】:2014-06-19 15:05:48
【问题描述】:
我经常在大型库的调试和发布版本之间切换。每当我发出一个
cmake . -DCMAKE_BUILD_TYPE=DEBUG
或者同样使用 RELEASE 并做一个 make,一切都在重新编译。我希望 cmake 仅重新编译自上次使用给定模式构建以来更改的文件。我可以这样做吗?如果可以,该怎么做?
我正在使用 OSX 和 clang。
【问题讨论】:
标签: cmake
我经常在大型库的调试和发布版本之间切换。每当我发出一个
cmake . -DCMAKE_BUILD_TYPE=DEBUG
或者同样使用 RELEASE 并做一个 make,一切都在重新编译。我希望 cmake 仅重新编译自上次使用给定模式构建以来更改的文件。我可以这样做吗?如果可以,该怎么做?
我正在使用 OSX 和 clang。
【问题讨论】:
标签: cmake
我相信最常见的解决方案是为每种编译模式(选项)设置独立的构建目录。
我的意思是你需要为此创建两个目录(如果你的源代码存储在ProjectSrc):
ProjectSrc
└── CMakeList.txt
ProjectBuild_Debug
ProjectBuild_Release
在ProjectBuild_Debug里面你需要打电话:
cmake -DCMAKE_BUILD_TYPE=Debug ../ProjectSrc
在ProjectBuild_Release 里面你需要打电话:
cmake -DCMAKE_BUILD_TYPE=Release ../ProjectSrc
现在您可以重新编译任何类型的程序,并且只会重新编译已更改的文件。
everything is recompiling - 一切都在重新编译,因为每个文件都必须使用指定的编译器选项进行编译,这是必要的。
一起来看看吧。例如我们的项目,构建可执行文件program.exe由两个源文件组成:one.cpp和two.cpp,它们都有调试输出。
release 选项构建:
one.o 和 two.o。one.cpp 并使用 debug 重建。现在,如果CMake 重建只更改了文件,您会遇到这样的情况:您期望program.exe 的调试版本具有正确的调试输出,但事实并非如此,因为文件two.o 中的调试输出根据上次编译选项被禁用。
【讨论】:
CMake 指令add_custom_command。 This question looks like related.