在 64 位 (FreeBSD) 上交叉编译 32 位架构

在 64 位 (FreeBSD) 上交叉编译 32 位架构

我在 64 位 FreeBSD 系统上交叉编译 32 位 FreeBSD 架构的库时遇到问题。我很高兴收到任何提示/建议。针对相同架构(64 位)进行编译效果很好。

我构建了 ports lang/gcc9 和 lang/gcc9-devel。在端口配置中,我启用了“multilib”,它应该针对 32 位和 64 位进行构建。如果我在系统上搜索可用的 libstdc,我会发现以下内容:

[root@build /usr/local/share/ohNet-build4FreeBSD/ohNet-ohNet_1.17.2776]# find / -iname "*libstdc*"
/usr/local/share/gcc-9.2.0/python/libstdcxx
/usr/local/lib32/gcc9/libstdc++.so.6.0.27
/usr/local/lib32/gcc9/libstdc++.so
/usr/local/lib32/gcc9/libstdc++.so.6
/usr/local/lib32/gcc9/libstdc++.so.6.0.27-gdb.py
/usr/local/lib32/gcc9/libstdc++.a
/usr/local/lib32/gcc9/libstdc++fs.a
/usr/local/lib/gcc9/libstdc++.so.6.0.27
/usr/local/lib/gcc9/libstdc++fs.a
/usr/local/lib/gcc9/libstdc++.so.6
/usr/local/lib/gcc9/libstdc++.so
/usr/local/lib/gcc9/libstdc++.a
/usr/local/lib/gcc9/libstdc++.so.6.0.27-gdb.py
/usr/ports/lang/libstdc++_stldoc_4.2.2

当编译 64 位时,我的项目构建得很好。编译 32 位时,我设置了以下环境变量:

export CROSS_COMPILE_CFLAGS=-m32
export CROSS_COMPILE_LINKFLAGS=-m32

并且构建失败

/usr/local/bin/ld: skipping incompatible /usr/local/lib/gcc9/gcc/x86_64-portbld-freebsd11.2/9.2.1/../../../libstdc++.a when searching for -lstdc++
/usr/local/bin/ld: cannot find -lstdc++

如果我理解正确的话,编译器无法找到兼容的 32 位库,尽管它们在那里(见上文)。请告知解决此问题的正确方法。

答案1

我知道已经很晚了,但我也遇到了这个问题,并且很难找到一个好的解决方案。看起来GCC在使用时无法找到自己的库路径-m32。主要问题是 FreeBSD 切换libc++回 FreeBSD 11,并且stdc++不再提供。

我让它工作的唯一方法是:

  1. 编译与-B/usr/lib32 -B/usr/local/lib32/gcc9/.老实说,这看起来像是 GCC 中的一个错误,因为运行时g++ main.cpp -v会显示 GCC 尝试使用错误的库路径调用 LD。这两个标志修复了它;第一个仅对于 GCC 7 及更低版本是必需的(GCC 8 及更高版本将在 /usr/lib32 中查找)。下一个对于所有版本的 G++ 都是必需的;替换gcc9为 GCC 实际附带的任何内容。
  2. 程序可以编译,但在运行时找不到libstdc++.so.6。要么使用-static-libstdc++(对于我的基于插件的程序来说不是一个很好的选择;所有 30 个 DLL 只增长了 1 MB),要么安装它,尽管它的名字如此,将添加x86 和 amd64compat9x-amd64的版本。libstdc++.so.6您需要重新启动或重新运行ldconfig才能使路径可见。这看起来也像是 GCC 中的一个错误,因为 GCC 在 ldconfig 中为 AMD64 库添加了一个配置文件,但没有针对 lib32 的配置文件(尽管有一个专用于 ldconfig32 的系统)。该compat9x软件包提供了一个 libstdc++,并且还将添加一个 ldconfig 的配置文件。

通过这个设置,我成功地构建了我的程序,尽管我仍然认为 FreeBSD 对 multilib 的支持非常差(许多 Linux 发行版都有更好的 multilib 支持,您可以并行安装 32 位和 64 位库,以及基于 Debian 的库和一些其他发行版甚至具有多架构支持,您还可以与主架构并行添加外部架构的交叉编译,例如 AMD64 上的 arm 和 powerpc)

相关内容