【问题标题】:Linking mingw64 C application to WebAssembly Binaryen C API将 mingw64 C 应用程序链接到 WebAssembly Binaryen C API
【发布时间】:2022-01-01 22:19:30
【问题描述】:

我在 Windows/mingw64 上并尝试使用 C 应用程序中的 Binaryen C API 生成 Web 程序集。我编译了binaryen共享库libbinaryen.dll没有问题,并试图重现hello world example。它按预期编译和执行,但在退出 main() 时挂起,returnexit() 都存在。

我认为异常处理可能有问题,因为 Binaryen DLL 是 C++,但无论我编译和链接 gcc 还是 g++,我都看到 main() 退出时出现相同的挂起。有趣的是,如果我将 Binaryen 编译为静态链接库 (libbinaryen.a) 并将其链接到我的可执行文件,问题就会消失,但这需要使用 g++ 进行编译。它会生成一个 16Mb 的可执行文件,所以我宁愿不这样做。

我正在使用 Mingw 版本 x86_64-posix-seh-rev0、gcc 8.1.0,并与 -lmingw32 -lbinaryen 链接。我尝试过直接链接到 DLL 和链接库,结果相同。

我猜这里的 C/C++ 互操作性存在一些问题,但不知道是什么问题。该问题还导致gdbmain() 退出时挂起,因此我无法准确指出发生了什么。

有人在 mingw 上从 C 调用 C++ DLL 时看到这种行为吗?

【问题讨论】:

    标签: webassembly mingw-w64


    【解决方案1】:

    我想我现在找到了原因,在这里发布以供参考。它看起来像 Binaryen 库 contains a static object ThreadPool 用于跟踪线程,并且由于它是一个 DLL,因此该对象在关闭时是 destructors are not called,这会在退出 main() 时导致线程死锁。通过定义 BINARYEN_CORES = 1 将 Binaryen 限制为单个线程可防止实例化 ThreadPool 对象并消除此问题。

    看起来这是 an open issue 使用 mingw/msys,希望它会在不久的将来得到解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2021-08-29
      • 2022-01-20
      相关资源
      最近更新 更多