在64位Ubuntu中构建32位应用


23

经过数小时的搜寻后,我决定放弃并请教专家。我试图在我的64 Ubuntu 11.10中构建一个32位应用程序(如果有兴趣,请使用xgap)。我在生成文件中添加了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 support。我想我只需要强制链接器生成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 /中的那些文件有什么用?



Answers:


15

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。


现在我认为我的设置有问题。每当我在上一个gcc命令中添加-m32时,它就会搜索/ usr / lib文件夹。如果我不添加-m32并使用-L / usr / lib32标志,它将搜索正确的目录,但会产生上述错误。你知道是什么原因造成的吗?
Rich

如果将两者结合在一起会发生什么(如上述示例所示)?
Andrejs Cainikovs 2011年

如果将两者结合起来,它仍然不会在/ usr / lib32中搜索。它只是在/ usr / lib中搜索。顺便说一句,我正在使用自动工具。
Rich

很奇怪..您是否尝试过喂食-l/usr/lib32/libXaw.so
Andrejs Cainikovs 2011年

它找不到它们....:gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld:找不到-l / usr / lib32 / libXaw.so
丰富

9

我收到如下错误:

/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

1
g++-multilib适用于g ++(C ++),适用于gcc(C)gcc-multilib
pevik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.