You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt 6.3.2编译链接错误求助:__std_init_once_link_alternate_names_and_abort未解析

编译Qt 6.3.2静态库时的MySQL链接错误排查

问题背景

尝试编译Qt 6.3.2静态版本,目前卡在一处链接错误,使用的依赖库如下:

  • MySQL 8.0.30
  • OpenSSL 1.1.1q
  • Zlib 1.2.12

编译使用的CMake命令

cmake.exe --trace-expand --trace-redirect=cmake.trace -DCMAKE_BUILD_TYPE=%qtBuildMode% -DBUILD_SHARED_LIBS=OFF -DQT_BUILD_EXAMPLES=OFF -DCMAKE_PREFIX_PATH="C:\LLVM\x64\static\debug;" -DZLIB_INCLUDE_DIR="C:\ZipDev\zlib-win-build-1.2.12" -DZLIB_LIBRARY="C:\ZipDev\zlib-win-build-1.2.12\build-VS2022-MT\x64\Debug\libz-static.lib" -DZLIB_USE_STATIC_LIBS=ON -DINPUT_static_runtime=ON -DFEATURE_ltcg=OFF -DBUILD_qtwebengine=OFF -DOPENSSL_ROOT_DIR="%qtBuildOpenSSLRootPath%" -DFEATURE_openssl_linked=ON -DOPENSSL_USE_STATIC_LIBS=TRUE -DOPENSSL_MSVC_STATIC_RT=TRUE -DINPUT_sql_mysql=ON -DMySQL_INCLUDE_DIR="%qtBuildMySqlIncludeDirsPath%" -DMySQL_LIBRARY="%qtBuildMySqlLibsPath%" -DCMAKE_INSTALL_PREFIX="%qtBuildPath%" -G Ninja %qtBuildSourcePath%

链接错误信息

[7197/9220] Linking CXX executable qtbase\bin\assistant.exe
FAILED: qtbase/bin/assistant.exe
cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --intdir=qttools\src\assistant\assistant\CMakeFiles\assistant.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100220~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100220~1.0\x64\mt.exe --manifests  -- C:\PROGRA~2\MICROS~3\2019\ENTERP~1\VC\Tools\MSVC\1429~1.301\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\assistant.rsp  /out:qtbase\bin\assistant.exe /implib:qttools\src\assistant\assistant\assistant.lib /pdb:qtbase\bin\assistant.pdb /version:0.0 /machine:x64 /debug /subsystem:windows  -DYNAMICBASE -NXCOMPAT -LARGEADDRESSAWARE  && cd ."
LINK: command "C:\PROGRA~2\MICROS~3\2019\ENTERP~1\VC\Tools\MSVC\1429~1.301\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\assistant.rsp /out:qtbase\bin\assistant.exe /implib:qttools\src\assistant\assistant\assistant.lib /pdb:qtbase\bin\assistant.pdb /version:0.0 /machine:x64 /debug /subsystem:windows -DYNAMICBASE -NXCOMPAT -LARGEADDRESSAWARE /MANIFEST /MANIFESTFILE:qtbase\bin\assistant.exe.manifest" failed (exit code 1120) with the following output:
   Creating library qttools\src\assistant\assistant\assistant.lib and object qttools\src\assistant\assistant\assistant.exp
mysqlclientMTd.lib(charset.obj) : error LNK2019: unresolved external symbol __std_init_once_link_alternate_names_and_abort referenced in function "void __cdecl std::call_once<void (__cdecl&)(void)>(struct std::once_flag &,void (__cdecl&)(void))" (??$call_once@A6AXXZ$$V@std@@YAXAEAUonce_flag@0@A6AXXZ@Z)
mysqlclientMTd.lib(my_malloc.obj) : error LNK2001: unresolved external symbol __std_init_once_link_alternate_names_and_abort
qtbase\bin\assistant.exe : fatal error LNK1120: 1 unresolved externals
[7206/9220] Building CXX object qttools\src\designer\src\designer\CMakeFiles\designer.dir\cmake_pch.cxx.obj
ninja: build stopped: subcommand failed.

错误原因分析

这个链接错误的核心是MySQL静态库与当前Qt编译环境的MSVC runtime版本、标准库实现不匹配:

  • __std_init_once_link_alternate_names_and_abort是MSVC标准库中std::call_once相关的符号,属于C++11及以后的线程支持模块。
  • 你使用的mysqlclientMTd.lib是Debug静态链接库,但可能是用更高版本MSVC编译的(比如你当前用VS2019,而MySQL库是VS2022编译的),或者MySQL库的编译选项(如C++标准、runtime链接方式)与Qt的编译选项不一致,导致符号无法匹配。

解决思路

  1. 统一MSVC版本:确保编译MySQL静态库的MSVC版本与编译Qt的版本完全一致(当前用VS2019,就用VS2019重新编译MySQL 8.0.30静态库)。
  2. 对齐Runtime链接方式:
    • 确认MySQL编译时使用了/MTd(Debug)或/MT(Release)的静态runtime选项,与Qt编译时的INPUT_static_runtime=ON保持一致,避免混用静态/动态runtime。
  3. 强制链接对应标准库:在CMake命令中添加链接器参数,强制指定对应版本的MSVC静态标准库:
    • Debug模式:-DCMAKE_EXE_LINKER_FLAGS="/DEFAULTLIB:libcmtd.lib"
    • Release模式:-DCMAKE_EXE_LINKER_FLAGS="/DEFAULTLIB:libcmt.lib"
  4. 补充MySQL依赖库:确保MySQL_LIBRARY指向的不仅是mysqlclientMTd.lib,还要包含MySQL编译时依赖的其他静态库(如libcrypto.lib、libssl.lib、zlib.lib等),多个库用分号分隔。
  5. 统一C++标准:验证Qt和MySQL的编译都使用相同的C标准(如C17),避免因标准库实现差异导致符号不兼容。

内容的提问来源于stack exchange,提问作者Cobra91151

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:25:38