使用 x86_64-w64-mingw32-cmake 编译时,与 libstdc++ 的动态链接不起作用

Dynamically linking with libstdc++ does not work when compiling with x86_64-w64-mingw32-cmake

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

Linux build build 运行完美,但在 windows 上应用程序崩溃并显示“过程入口点......basic_ostringstream......char_traits.. 无法在动态 link 库中找到 ....

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

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

我尝试将 libstdc++-6.dll 文件放在目录中,问题仍然存在。 我尝试在动态 linked 的共享库中静态 linking 它,仍然存在同样的问题。

这是我的动态 linked 版本的 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 不同...

我试过另一个,效果很好!

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