首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >64位上32位体系结构的交叉编译(FreeBSD)

64位上32位体系结构的交叉编译(FreeBSD)
EN

Unix & Linux用户
提问于 2019-09-17 13:48:24
回答 1查看 997关注 0票数 1

我在64位FreeBSD -系统上交叉编译32位FreeBSD架构的库时遇到了问题。任何暗示/建议,我都很高兴。为相同的体系结构(64位)编译很好。

我建造了港口lang/gcc9 9&lang/gcc9 9-devel。在端口的配置中,我启用了"multilib",它应该构建32位和64位。如果我在系统上搜索可用的libstdc,我会发现以下内容:

代码语言:javascript
复制
[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位时,我设置了以下env变量:

代码语言:javascript
复制
export CROSS_COMPILE_CFLAGS=-m32
export CROSS_COMPILE_LINKFLAGS=-m32

而构建失败了

代码语言:javascript
复制
/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位库,尽管它们在那里(见上文)。请给出正确的解决方法。

EN

回答 1

Unix & Linux用户

发布于 2020-08-11 16:26:08

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

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

  1. -B/usr/lib32 -B/usr/local/lib32/gcc9/编译。老实说,这就像是GCC的一个错误,因为运行g++ main.cpp -v会显示GCC试图用错误的lib路径调用LD。这两面旗子是固定的;第一面只有GCC 7岁及以下的时候才需要(GCC 8岁及以上将出现在/usr/lib32 32中)。下一个版本对于G++的所有版本都是必要的;用GCC实际附带的任何东西替换gcc9
  2. 该程序将编译,但无法在运行时找到libstdc++.so.6。要么使用-static-libstdc++ (对于我的基于插件的程序来说不是一个很好的选择;所有30个DLL只是增长了一个兆字节),要么安装compat9x-amd64,尽管它的名字,将为x86和amd64添加一个libstdc++.so.6版本。您需要重新启动或重新运行ldconfig,以使路径变得可见。这看起来也像GCC中的一个bug,GCC在ldconfig中为AMD64库添加了一个配置文件,但是lib32没有这个配置文件(尽管ldconfig32有一个专用的系统)。compat9x包提供了一个libstdc++,并将为ldconfig添加一个配置文件。

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

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/542276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档