Windows下用Jom构建Qt C++项目遇C1041错误,求解决方案
Qt Creator+Jom编译Release模式触发C1041错误的问题与解决思路
问题场景
- Windows系统下使用Qt Creator搭配Visual Studio编译器编译大型C++项目,开启Jom替代Nmake后编译速度提升10倍
- 此前数月Release模式使用Jom编译正常,但近几周该组合编译失败;Debug模式用Jom、Release模式用Nmake仍可正常编译
- 报错信息:C1041 multiple cl.exe write to the same .pdb file. Use /FS
- 出错的编译命令示例:
cl -c -wd4100 -wd4244 -wd4068 -wd4267 -utf-8 /we4715 -O2 -Zi -MD -EHsc -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 /FdC:/Users/fgodi/Desktop/release/lib64/boost_components.pdb -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DWIN64 -DNDEBUG -D_REENTRANT -DHAVE_EIGEN -DEIGEN_DONT_PARALLELIZE -DHAVE_HDF5 -DWIN32_LEAN_AND_MEAN -DNOMINMAX -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS -D_USE_DECLSPECS_FOR_SAL -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_SECURE_SCL=0 -D_ITERATOR_DEBUG_LEVEL=0 -DNDEBUG -DARCH_SSE2 -DBOOST_THREAD_PROVIDES_FUTURE -DBOOST_THREAD_VERSION=4 -DBOOST_THREAD_BUILD_LIB -DQT_QML_DEBUG -IC:\Users\fgodi\Desktop\release\src\boost -I. -IC:\Users\fgodi\Desktop\release\src\boost -IC:/Users/fgodi/Desktop/release/src/boost/.libs/boost/libs/math/src/tr1 -IC:\Users\fgodi\Desktop\release\src -IC:\Users\fgodi\Desktop\release\src\boost -IC:\Users\fgodi\Desktop\release\include -IC:\Users\fgodi\Desktop\release\src\eigen -IC:\Users\fgodi\Desktop\release\include\hdf5 -IC:\Qt\5.13.2\msvc2017_64\mkspecs\win32-msvc -Fobuild-msvc-64-release\ @C:\Users\fgodi\AppData\Local\Temp\global_resource.obj.9152.219.jom global_resource.cpp
用户疑问与对应解决思路
疑问1:如何全局添加/FS参数,是否需要修改所有.pro文件?
不需要逐个修改子项目的.pro文件,直接在主项目的.pro中添加针对MSVC编译的全局参数即可,Qt的SUBDIRS结构会自动继承主项目的编译配置:
# 针对Release模式的C++编译追加/FS参数 QMAKE_CXXFLAGS_RELEASE += /FS # 若项目包含C代码,同时追加C编译参数 QMAKE_CFLAGS_RELEASE += /FS
如果是分散的项目结构,也可以把这段配置写入一个common.pri文件,然后在所有需要的.pro中通过include(common.pri)引入,避免重复配置。
疑问2:添加/FS能否解决问题?
大概率可以解决。/FS是MSVC专门为并行编译场景设计的参数,作用是启用“文件系统同步”模式,允许多个cl.exe进程同时写入同一个PDB文件,正好匹配你遇到的C1041错误场景:
- Jom是并行编译工具,会同时启动多个cl进程;Nmake默认串行,所以不会触发冲突
- Debug模式下MSVC默认生成每个目标文件对应的单独PDB(.pdb与.obj配对),最后再合并,因此也不会出现多进程写同一个PDB的冲突
若暂时无法直接验证,可以先降低Jom的并行线程数(Qt Creator路径:工具->选项->构建和运行->套件->对应MSVC套件->构建环境,添加环境变量JOM_MAX_PROCESSES=4),减少并发冲突的概率,同时排查项目是否新增了依赖或修改了PDB输出路径配置。
疑问3:为何此前正常,现在突然需要/FS?
可能的原因包括:
- 项目新增了代码文件或依赖,并行编译时同时写PDB的进程数增加,超出了MSVC默认PDB锁的处理能力
- 最近更新了Visual Studio补丁或Qt Creator版本,编译器或Jom的并行逻辑发生变化
- 系统磁盘性能下降(如系统盘空间不足、SSD缓存耗尽),导致PDB文件写操作变慢,更容易触发并发冲突
- 最近修改了编译配置,比如新增了
/Zi参数(你的命令中包含该参数,用于将调试信息写入单独的PDB文件),Release模式下开启/Zi后,并行编译会大幅提升PDB冲突的概率,之前可能未开启或使用的是/Z7(将调试信息嵌入.obj文件)
内容的提问来源于stack exchange,提问作者François
相关产品推荐
相关产品推荐

