【问题标题】:Building a 32-bit app in 64-bit Ubuntu在 64 位 Ubuntu 中构建 32 位应用程序
【发布时间】:2012-01-15 07:21:09
【问题描述】:

经过几个小时的谷歌搜索,我决定放弃并请教各位专家。我正在尝试在我的 64 位 Ubuntu 11.10 中构建一个 32 位应用程序(如果有人感兴趣,则为 xgap)。我在 makefile 中添加了 CFLAGS=-m32LDFLAGS=-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-libsmutilib 支持。我想我只需要强制链接器生成 i386 输出。如上所示,我尝试在我的 gcc 命令中放置两个 ld 标志:-melf_i386-oformat elf32-i386。但发生的情况是 gcc 不再在 /usr/lib32 中搜索 32 位库。我想知道是否需要将这些标志按固定顺序排列?

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

编辑:当我在最后一个 gcc 命令(我相信的链接阶段)中添加 -m32 标志时,即使我有 -L/usr/lib32 标志,gcc 也不会t 在 /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

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

【问题讨论】:

标签: gcc 32bit-64bit ld


【解决方案1】:

您还需要使用-m32 的链接。

gcc -m32 -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

考虑到所有因素,我认为您在使用-m32 时应该可以放弃-L/usr/lib32

【讨论】:

  • 当我提出你的建议时,gcc 不再在 /usr/lib32 中搜索。它在 /usr/lib/ 中搜索。错误信息如下:/usr/bin/ld: 搜索-lXaw /usr时跳过不兼容的/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so /bin/ld: 搜索 -lXaw 时跳过不兼容的 /usr/lib/libXaw.so /usr/bin/ld: 找不到 -lXaw collect2: ld 返回 1 个退出状态
  • 你知道为什么会这样吗?
  • 看来 Ubuntu 做的事情与我预期的不同。或者ia32-libs 包不是您所期望的。它并没有神奇地包含系统上所有 64 位库的每个 32 位对应项,只有一些核心内容。你需要lib32-libXau 或其他东西,不确定 Debian/Ubuntu 是如何处理的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多