切换CMake生成器(Ninja转Unix Makefiles)时保留构建进度
从Ninja转Unix Makefiles,保留已构建进度的实操方法
直接说结论:可以保留已完成的构建产物,不用全量重编,但得手动处理CMake的缓存文件——因为Ninja和Makefiles的构建脚本不兼容,没法直接转换,但已编译的目标文件、库是可以复用的。
具体步骤:
先备份构建目录
复制当前的CMake构建目录(比如build/)到备份目录,防止操作翻车:cp -r build build_ninja_backup清理Ninja相关缓存,保留编译产物
进入原构建目录,删除CMake生成的Ninja专属文件和核心缓存,但别删已编译的目标文件:cd build rm -f build.ninja CMakeCache.txt cmake_install.cmake rm -rf CMakeFiles/CMakeDirectoryInformation.cmake CMakeFiles/*/cmake.check_cache注意:
CMakeFiles/下的*.o、*.a、*.so这些编译出来的文件要留着,只清CMake的配置缓存和Ninja脚本。重新生成Makefiles构建脚本
用CMake指定Unix Makefiles生成器,重新生成Makefile:cmake -G "Unix Makefiles" ..CMake会重新扫描项目生成Makefile,同时会自动检测已有的编译产物——只要这些产物的依赖(源文件、头文件)没变化,Make就会跳过它们,只处理剩下的400个待构建文件。
验证后执行构建
先跑make -n模拟构建,确认只有需要的文件会被编译,没问题再实际构建:make -n make -j$(nproc) # 按需调整并行数,避免再触发内存问题
要注意的点
- 如果某个已构建文件的源/头文件在切换前被改过,Make会重新编译它,这是正常的依赖检查逻辑,没法避免。
- Ninja和Makefiles的依赖跟踪文件不通用,所以必须让CMake重新生成Makefile,但二进制产物是跨生成器通用的(只要是同平台编译)。
- 要是项目有复杂的自定义CMake脚本,切换后最好检查下Makefile的生成是否正常,避免意外全编。
内容的提问来源于stack exchange,提问作者Ilyass
相关产品推荐
相关产品推荐

