【问题标题】:Dynamically linking with libstdc++ does not work when compiling with x86_64-w64-mingw32-cmake使用 x86_64-w64-mingw32-cmake 编译时,与 libstdc++ 的动态链接不起作用
【发布时间】:2020-05-04 02:38:16
【问题描述】:

我正在从我的 Linux 64 位机器交叉编译一个仅限 Windows 64 位的应用程序。

Linux 构建版本完美运行,但在 Windows 上,应用程序崩溃并显示“过程入口点......basic_ostringstream......char_traits......无法在动态链接库中找到。 ...

我正在编译和使用我在运行时加载的许多 .dll 文件,我不想在每个文件上静态链接到 libstdc++,因为它会在每个文件上增加 15 兆字节,这对我的模块化系统可能没有意义数百个模块,否则只有 500kb..

我接受的是在可执行目录中放置一个 dll,或者将其静态链接到一个动态链接到这些模块的库中。 两者似乎都不起作用。

我尝试将 libstdc++-6.dll 文件放在目录中,但问题仍然存在。 我尝试将它静态链接到一个动态链接的共享库中,仍然是同样的问题。

这是我的动态链接版本的 cmake 配置:

target_link_libraries(myModule gcc stdc++)

当我使用-static-libstdc++ 而不是stdc++ 时,它运行良好,但由于生成的库中的大小增加,该解决方案很糟糕。

有人有解决办法吗? 我是不是做错了什么?


~ >>> x86_64-w64-mingw32-g++ -v                                                                                                    
Using built-in specs.
COLLECT_GCC=x86_64-w64-mingw32-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/9.3.0/lto-wrapper
Target: x86_64-w64-mingw32
Configured with: /home/olivier/.cache/yay/mingw-w64-gcc/src/gcc/configure --prefix=/usr --libexecdir=/usr/lib --target=x86_64-w64-mingw32 --with-pkgversion='Arch Linux 9.3.0-1' --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-threads=posix --enable-fully-dynamic-string --enable-libstdcxx-time=yes --enable-libstdcxx-filesystem-ts=yes --with-system-zlib --enable-cloog-backend=isl --enable-lto --disable-dw2-exceptions --enable-libgomp --disable-multilib --enable-checking=release
Thread model: posix
gcc version 9.3.0 (Arch Linux 9.3.0-1) 

编辑:已解决。 原来我没有使用正确的 libstdc++-6.dll 文件...... 在我的系统上找到它后,有多个文件

>>> locate libstdc++-6.dll
/home/****/****/****/libstdc++-6.dll
/usr/i686-w64-mingw32/bin/libstdc++-6.dll
/usr/x86_64-w64-mingw32/bin/libstdc++-6.dll

我对所有三个结果进行了比较(第一个是我复制到我的 Windows 机器上的那个不工作)

不知怎的,我用的那个和i686-w64一样,和x86_64-w64不一样...

我尝试了另一个,它成功了!

【问题讨论】:

  • 您使用的是哪个 libstdc++-6.dll?您确定该程序确实在加载您提供的程序吗? Process Monitor 或 Dependency Walker 可能会发现问题。
  • @DavidMacek 哪一个是正确的?我在我的 linux 机器上安装 mingw 时提供的那个?
  • 我相信是这样,但例如 Ubuntu 有两个版本的工具链,所以最好选择一个合适的。 x86_64-w64-mingw32-g++ -v 可能会告诉您您正在使用哪一个(除非 CMake 以某种方式决定使用另一个)。
  • @DavidMacek 我已将该命令的输出添加到我的帖子中
  • 如果您使用来自/usr/lib/gcc/x86_64-w64-mingw32/9.3.0 的DLL,这似乎没问题。您是否尝试过 Dependency Walker 或 Process Monitor?例如,Ubuntu 的 libstdc++-6.dll 也依赖于 libgcc_s_seh-1.dll 和 libwinpthread-1.dll。如果符号确实存在,您还可以使用nm 检查 DLL。

标签: c++ cmake mingw-w64 libstdc++


【解决方案1】:

解决了。 对于遇到此问题的其他任何人,请确保您使用的 dll 来自与您正在编译的相同版本的 mingw。

【讨论】:

    猜你喜欢
    • 2022-10-20
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多