Windows11下编译Qt6.8.1源码失败求助(需保留PDB文件)
Qt 6.8.1 Windows 11 Release编译生成PDB失败问题解决
问题背景
在Windows 11环境编译Qt 6.8.1源码的Release版本时,启用-force-debug-info和-separate-debug-info参数以生成PDB文件,编译过程中触发moc工具崩溃;移除这两个参数或改用Debug模式可正常编译,但需保留Release版本的PDB支持。
编译命令
"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 10.0.22621.0 -vcvars_ver=14.29.30133 set INCLUDE=C:\Library\vcpkg\installed\v142-x64-dynamic-md\include;%INCLUDE% set LIB=C:\Library\vcpkg\installed\v142-x64-dynamic-md\lib;%LIB% set PATH=C:\Library\vcpkg\installed\v142-x64-dynamic-md\bin;%PATH% set PATH=c:\DevTool\libclang-riit\release\bin;%PATH% .\configure.bat -platform win32-msvc -nomake tests -nomake examples -opensource -confirm-license ^ -prefix output/v142-x64-release-dynamic-md ^ -release ^ -shared ^ -force-debug-info ^ -separate-debug-info ^ -c++std c++17 ^ -skip qtdoc ^ -skip qtwebengine ^ -skip qtwebview ^ -system-zlib ^ ZLIB_LIBS="zlib.lib" ^ -system-libpng ^ LIBPNG_LIBS="libpng16.lib" ^ -system-libjpeg ^ LIBJPEG_LIBS="jpeg.lib turbojpeg.lib" ^ -system-freetype ^ FREETYPE_LIBS="freetype.lib" ^ -system-harfbuzz ^ -system-sqlite ^ -system-pcre ^ PCRE2_LIBS="pcre2-8.lib pcre2-16.lib pcre2-32.lib pcre2-posix.lib" ^ -system-doubleconversion ^ -system-webp ^ WEBP_LIBS="libwebpdecoder.lib libwebpdemux.lib libwebpmux.lib libwebp.lib" ^ -system-tiff ^ TIFF_LIBS="tiff.lib" ^ -ssl ^ -openssl ^ -openssl-runtime ^ OPENSSL_LIBS="libssl.lib libcrypto.lib" ^ -icu ^ ICU_LIBS="icudt.lib icuin.lib icuio.lib icuuc.lib" ^ -gif ^ -ico ^ -no-vulkan ^ -no-xcb ^ -no-egl ^ -no-libudev ^ -no-slog2 ^ -no-dbus ^ -DCMAKE_CXX_STANDARD=17 ^ -DCMAKE_C_STANDARD=11 cmake --build . --parallel
错误信息
c:\Work\Source\QT\QT_6.8.1>cmake --build build\v142-release-shared-md --target qtbase [132/1528] Automatic MOC for target QSchannelBackendPlugin FAILED: qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/timestamp qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/mocs_compilation.cpp C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/timestamp C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/mocs_compilation.cpp C:\WINDOWS\system32\cmd.exe /C "cd /D C:\Work\Source\QT\QT_6.8.1\build\v142-release-shared-md\qtbase\src\plugins\tls\schannel && C:\DevTool\cmake\bin\cmake.exe -E cmake_autogen C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel/CMakeFiles/QSchannelBackendPlugin_autogen.dir/AutogenInfo.json RelWithDebInfo && C:\DevTool\cmake\bin\cmake.exe -E touch C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/timestamp && C:\DevTool\cmake\bin\cmake.exe -E cmake_transform_depfile Ninja gccdepfile C:/Work/Source/QT/QT_6.8.1 C:/Work/Source/QT/QT_6.8.1/qtbase/src/plugins/tls/schannel C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/deps C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/CMakeFiles/d/0c35499e00e5c581ee7c4eee6475462d3a5c5365e156a5d2aafd13f3ce126fc6.d" AutoMoc subprocess error ------------------------ The moc process failed to compile "SRC:/qtbase/src/plugins/tls/schannel/qtlsbackend_schannel_p.h" into "SRC:/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/EWIEGA46WW/moc_qtlsbackend_schannel_p.cpp" Process failed with return value 3221225781 Command ------- C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/bin/moc.exe -DCMAKE_CXX_STANDARD=17 -DCMAKE_C_STANDARD=11 -DNOMINMAX -DQSchannelBackendPlugin_EXPORTS -DQT_CORE_LIB -DQT_DEPRECATED_WARNINGS -DQT_EXPLICIT_QFILE_CONSTRUCTION_FROM_PATH -DQT_LEAN_HEADERS=1 -DQT_NETWORK_LIB -DQT_NO_CAST_FROM_ASCII -DQT_NO_DEBUG -DQT_NO_EXCEPTIONS -DQT_NO_FOREACH -DQT_NO_JAVA_STYLE_ITERATORS -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_QASCONST -DQT_NO_QEXCHANGE -DQT_NO_QSNPRINTF -DQT_PLUGIN -DQT_USE_QSTRINGBUILDER -DUNICODE -DWIN32 -DWIN64 -D_CRT_SECURE_NO_WARNINGS -D_ENABLE_EXTENDED_ALIGNED_STORAGE -D_UNICODE -D_WIN64 -IC:/Work/Source/QT/QT_6.8.1/qtbase/src/plugins/tls/schannel -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/network -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include/QtNetwork/6.8.1 -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include/QtNetwork/6.8.1/QtNetwork -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/corelib -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include/QtCore/6.8.1 -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include/QtCore/6.8.1/QtCore -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include/QtCore -IC:/Work/Source/QT/QT_6.8.1/qtbase/mkspecs/win32-msvc -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include/QtNetwork --output-json --output-dep-file -o C:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/src/plugins/tls/schannel/QSchannelBackendPlugin_autogen/EWIEGA46WW/moc_qtlsbackend_schannel_p.cpp C:/Work/Source/QT/QT_6.8.1/qtbase/src/plugins/tls/schannel/qtlsbackend_schannel_p.h Output ------
问题分析
返回值3221225781对应Windows系统的STATUS_ACCESS_VIOLATION(内存访问冲突),说明moc工具在处理qtlsbackend_schannel_p.h时崩溃。该问题仅在启用-force-debug-info和-separate-debug-info时触发,推测是Qt的moc工具在Release模式下生成调试信息的逻辑存在兼容性问题,或与vcpkg依赖库的调试符号路径冲突。
解决方法
1. 替换Qt调试信息参数为CMake原生参数
移除Qt的-force-debug-info和-separate-debug-info参数,改用CMake直接控制Release模式下的PDB生成:
.\configure.bat -platform win32-msvc -nomake tests -nomake examples -opensource -confirm-license ^ -prefix output/v142-x64-release-dynamic-md ^ -release ^ -shared ^ -c++std c++17 ^ -skip qtdoc ^ -skip qtwebengine ^ -skip qtwebview ^ -system-zlib ^ ZLIB_LIBS="zlib.lib" ^ -system-libpng ^ LIBPNG_LIBS="libpng16.lib" ^ -system-libjpeg ^ LIBJPEG_LIBS="jpeg.lib turbojpeg.lib" ^ -system-freetype ^ FREETYPE_LIBS="freetype.lib" ^ -system-harfbuzz ^ -system-sqlite ^ -system-pcre ^ PCRE2_LIBS="pcre2-8.lib pcre2-16.lib pcre2-32.lib pcre2-posix.lib" ^ -system-doubleconversion ^ -system-webp ^ WEBP_LIBS="libwebpdecoder.lib libwebpdemux.lib libwebpmux.lib libwebp.lib" ^ -system-tiff ^ TIFF_LIBS="tiff.lib" ^ -ssl ^ -openssl ^ -openssl-runtime ^ OPENSSL_LIBS="libssl.lib libcrypto.lib" ^ -icu ^ ICU_LIBS="icudt.lib icuin.lib icuio.lib icuuc.lib" ^ -gif ^ -ico ^ -no-vulkan ^ -no-xcb ^ -no-egl ^ -no-libudev ^ -no-slog2 ^ -no-dbus ^ -DCMAKE_CXX_STANDARD=17 ^ -DCMAKE_C_STANDARD=11 ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_CXX_FLAGS_RELEASE="/Zi /Ob2 /O2 /DNDEBUG" ^ -DCMAKE_SHARED_LINKER_FLAGS_RELEASE="/DEBUG /OPT:REF /OPT:ICF"
/Zi:生成完整的PDB文件/DEBUG:告诉链接器生成调试信息/OPT:REF和/OPT:ICF:优化链接,移除未使用代码并合并重复函数,不影响PDB有效性
2. 升级工具链版本
确保使用最新版本的CMake(建议3.28及以上)和MSVC 2022工具集,旧版本可能存在调试信息生成的兼容性Bug。可通过vcvarsall.bat指定最新工具链版本,例如:
"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 10.0.22621.0 -vcvars_ver=14.38.33130
3. 检查vcpkg依赖路径
确认vcpkg的INCLUDE、LIB、PATH仅指向Release版本的依赖库(v142-x64-dynamic-md),避免混入Debug库路径导致符号冲突。
4. 手动预编译moc工具(可选)
若问题仍存在,可先单独编译moc工具,再手动运行moc处理出错的头文件,排查具体崩溃原因:
cd build/v142-release-shared-md/qtbase/bin moc.exe -DQT_NO_DEBUG -IC:/Work/Source/QT/QT_6.8.1/qtbase/src/plugins/tls/schannel -IC:/Work/Source/QT/QT_6.8.1/build/v142-release-shared-md/qtbase/include C:/Work/Source/QT/QT_6.8.1/qtbase/src/plugins/tls/schannel/qtlsbackend_schannel_p.h
内容的提问来源于stack exchange,提问作者pp w
相关产品推荐
相关产品推荐

