【发布时间】: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++