当前位置: 首页>>技术教程>>正文


在 64 位 Ubuntu 中构建 32 位应用程序

,

问题描述

经过数小时的谷歌搜索,我决定放弃并请教各位专家。我正在尝试在我的 64 位 Ubuntu 11.10 中构建一个 32 位应用程序(如果有人感兴趣,则为 xgap)。我在 makefile 中添加了 CFLAGS=-m32 和 LDFLAGS=-L/usr/lib32。对象被构建成 32 位精细。最后一步是将X窗口的所有对象和库链接到这个可执行文件—xgap。不知何故,它一直给我这个错误:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

我已经安装了 ia32-libs 和 mutilib 支持。我想我只需要强制链接器生成 i386 输出。如上所示,我尝试在我的 gcc 命令中放置两个 ld 标志:-melf_i386 和 -oformat elf32-i386。但是发生的事情是 gcc 不再在 /usr/lib32 中搜索 32 位库。我想知道是否需要将这些标志按固定顺序排列?

感谢您的任何想法和帮助!

编辑:当我在最后一个 gcc 命令中添加 -m32 标志时(我相信是链接阶段),即使我有 -L/usr/lib32 标志,gcc 也不再在 /usr/lib32 中搜索(真的奇怪…)并生成以下错误:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

有人知道为什么会这样吗?我正在使用自动工具进行配置和制作。我真的很擅长修改那些脚本文件。

EIDT:我解决了这个问题。我认为 gcc 期待一个静态库存档。我使用 http://ubuntuforums.org/showthread.php?t=474790 中的 getlibs 脚本来下载链接所需的所有 .a 档案。然后 gcc 工作。我认为 gcc 确实在 /usr/lib32 目录中进行了搜索,但没有找到 .a 档案,因此继续在标准目录 /usr/lib 中进行搜索,在那里它找到了不兼容的 *.so 文件。

但接下来的问题是:来自包 ia32-libs 的 /usr/lib32/中的 *.so 文件真的没有链接所需的库吗? /usr/lib32/中的那些文件是做什么用的?

最佳答案

LDFLAGS 也应该包括 -m32。以下应该工作:

export LDFLAGS='-m32 -L/usr/lib32'

实际上,您可以删除 -L/usr/lib32 部分,因为这是 32 位库的默认目录,并且您的系统知道这一点。

基本上,在 64 位机器上构建 32 位应用程序的最简单方法是:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

..或 feed those variables to configure script 如果您使用的是自动工具。

更新:

似乎您对链接静态库和动态库的区别并不十分熟悉。我会尽量减少:

  • 静态和动态开发库都具有相同的文件扩展名 .a

  • 如果您安装了同一库的静态和动态版本,其中一个可能有额外的后缀,例如 libname.a 用于动态版本和 libname_s.a 用于静态版本。

  • 当然,静态和动态库版本的大小不同。静态版较重。

  • 如果您与静态库链接 – 您的应用程序没有依赖关系。如果您与动态库链接,它将依赖于系统中应该存在的 .so 运行时库。

请注意,我们在这里讨论的不是高级技巧,例如使用 dlopen()/dlsym() API 显式加载 DSO。

次佳答案

我收到了以下错误:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

这为我修复了它:

sudo apt-get install g++-multilib

如果您使用的不是默认的 gcc 包(例如 gcc-7 ),那么您需要安装该特定版本的包:

sudo apt-get install g++-7-multilib

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13147.html,未经允许,请勿转载。