【问题标题】:Why does Wine 7.10+ hang when C++ program links statically with sqlite3?为什么当 C++ 程序与 sqlite3 静态链接时 Wine 7.10+ 会挂起?
【发布时间】:2023-01-17 05:55:53
【问题描述】:

考虑一个 C++ 程序:

#include <sqlite3.h>

int main(int argc, char**argv) {
  return 0;
}

void not_called() {
  sqlite3_initialize();
}

编译、链接并运行它:

$ x86_64-w64-mingw32-g++ -c -g -o augh.o augh.cpp
$ x86_64-w64-mingw32-g++ -static -fstack-protector -g -o augh.exe augh.o -lsqlite3
$ wine augh.exe

在 Fedora 36 上,

  • mingw64-gcc-c++-11.2.1-5.fc36.x86_64
  • wine-7.12-1.fc36.x86_64
  • mingw64-sqlite-static-3.36.0.0-3.fc36.noarch

并且之前使用 wine-7.10-2.fc36.x86_64,我一直得到这个输出:

[juckelman@midas augh]$ ./augh.exe 
002c:fixme:winediag:LdrInitializeThunk wine-staging 7.12 is a testing version containing experimental patches.
002c:fixme:winediag:LdrInitializeThunk Please mention your exact version when filing bug reports on winehq.org.
MESA-INTEL: warning: Haswell Vulkan support is incomplete
MESA-INTEL: warning: Haswell Vulkan support is incomplete
MESA-INTEL: warning: Haswell Vulkan support is incomplete
MESA-INTEL: warning: Haswell Vulkan support is incomplete
0080:err:x11drv:X11DRV_ChangeDisplaySettingsEx Failed to write L"\\\\.\\DISPLAY1" display settings to registry.
0080:err:system:NtUserChangeDisplaySettings Changing L"\\\\.\\DISPLAY1" display settings returned -3.
0080:err:explorer:initialize_display_settings Failed to initialize registry display settings for L"\\\\.\\DISPLAY1".
0114:err:sync:RtlpWaitForCriticalSection section 00000002DE99D010 "?" wait timed out in thread 0114, blocked by 0000, retrying (60 sec)

最后一行无休止地重复,程序永远不会退出。

如果我注释掉sqlite3_initialize()(在从未调用过的函数!), 我得到这个输出:

[juckelman@midas augh]$ ./augh.exe 
002c:fixme:winediag:LdrInitializeThunk wine-staging 7.12 is a testing version containing experimental patches.
002c:fixme:winediag:LdrInitializeThunk Please mention your exact version when filing bug reports on winehq.org.
MESA-INTEL: warning: Haswell Vulkan support is incomplete
MESA-INTEL: warning: Haswell Vulkan support is incomplete
MESA-INTEL: warning: Haswell Vulkan support is incomplete
MESA-INTEL: warning: Haswell Vulkan support is incomplete
0080:err:x11drv:X11DRV_ChangeDisplaySettingsEx Failed to write L"\\\\.\\DISPLAY1" display settings to registry.
0080:err:system:NtUserChangeDisplaySettings Changing L"\\\\.\\DISPLAY1" display settings returned -3.
0080:err:explorer:initialize_display_settings Failed to initialize registry display settings for L"\\\\.\\DISPLAY1".
[juckelman@midas augh]$

程序每次都成功退出。

在 Fedora 35 上

  • mingw64-gcc-c++-11.2.1-3.fc35.x86_64
  • wine-7.2-1.fc35.x86_64
  • mingw64-sqlite-static-3.36.0.0-2.fc35.noarch

无论sqlite3_initialize() 是否存在,程序都会成功退出。

在 Fedora 36 上,如果我改为动态链接 sqlite3,程序也会成功退出。

这里发生了什么?

【问题讨论】:

  • sqlite3 也是用于静态链接的编译器吗?如果不是,您将有 2 个 C 运行时支持库试图管理堆分配的对象。
  • @RichardCritten 是的,我安装了mingw64-sqlite-static 包并且我检查了augh.exeobjdump 以确保我没有链接到任何DLL。

标签: c++ linux sqlite mingw wine


【解决方案1】:

这不再发生在 Wine 7.22 中。解决办法是升级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多