使用 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 版本。
我正在从我的 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 版本。