![在 64 位 Ubuntu 中构建 32 位应用程序](https://linux22.com/image/1106834/%E5%9C%A8%2064%20%E4%BD%8D%20Ubuntu%20%E4%B8%AD%E6%9E%84%E5%BB%BA%2032%20%E4%BD%8D%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.png)
经过几个小时的谷歌搜索,我决定放弃并向各位专家请教。我正在尝试在 64 位 Ubuntu 11.10 中构建一个 32 位应用程序(如果有人感兴趣的话,可以参考 xgap)。我添加了CFLAGS=-m32和LDFLAGS=-L /usr/lib32在 makefile 中。对象已完美构建到 32 位。最后一步是将 X windows 的所有对象和库链接到此可执行文件---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-库和多种支持。我想我只需要强制链接器生成 i386 输出。我尝试将两个德我的 gcc 命令中的标志如上所示:-melf_i386和-oformat elf32-i386。但实际情况是 gcc 不会在/usr/lib32不再。我想知道我是否需要按照某种固定顺序放置这些标志?
感谢您的任何想法和帮助!
编辑:当我在最后一个 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
有人知道为什么会发生这种情况吗?我正在使用自动工具进行配置和制作。我非常擅长修改这些脚本文件。
电离辐射检测:我解决了这个问题。我认为海湾合作委员会期望的是静态库存档。我使用了获取库脚本来自http://ubuntuforums.org/showthread.php?t=474790下载链接所需的所有 .a 档案。然后海湾合作委员会有效。我认为海湾合作委员会搜索过/usr/lib32目录,但没有找到 。A档案馆因此继续在标准目录中搜索/usr/lib,它发现不兼容的*。所以文件。
但问题是:*。所以文件/usr/lib32/来自包ia32-库没有真正需要链接的库吗?这些文件在/usr/lib32/用于?
答案1
LDFLAGS
-m32
也应该包括。以下应该有效:
export LDFLAGS='-m32 -L/usr/lib32'
事实上,您可以删除-L/usr/lib32
部分,因为这是 32 位库的默认目录,并且您的系统知道这一点。
基本上,在 64 位机器上构建 32 位应用程序的最简单方法是:
export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make
..或者将这些变量提供给配置脚本如果您使用自动工具。
更新:
似乎您不太熟悉链接静态库和动态库的区别。我会尽量简化:
- 静态和动态开发库都具有相同的文件扩展名
.a
- 如果您安装了同一个库的静态和动态版本,其中一个版本可能会有额外的后缀,例如
libname.a
动态libname_s.a
版本和静态版本。 - 当然,静态和动态库版本的大小不同。静态版本更重。
- 如果您链接静态库,您的应用程序就没有依赖项。如果您链接动态库,它将依赖于
.so
系统中应该存在的运行时库。
请注意,我们在这里不讨论高级技巧,例如使用 dlopen()/dlsym() API 明确加载 DSO。
答案2
我遇到了如下错误:
/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