在Ubuntu 14.04 LTS(Trusty Tahr)中安装ia32-libs的方法

116

我昨天安装了Ubuntu 14.04(Trusty Tahr)。一切似乎都没问题。但是当我尝试编译一些C代码时,我遇到了以下错误。这个错误似乎是由于操作系统缺少32位架构支持导致的。错误输出如下:

/usr/bin/ld: i386 architecture of input file `./libsc.a(ftl_msg.o)' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `./libsc.a(libsc_debug.o)' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `./libsc.a(libsc_str.o)' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `./libsc.a(libsc_cfg_common.o)' is incompatible with i386:x86-64 output

我以前在使用Ubuntu 12.04(Precise Pangolin)时,经常使用apt-get install ia32-libs。但我知道自从Ubuntu 13.10(Saucy Salamander)后,Ubuntu已经删除了ia32-libs。我该如何解决这个问题?


检查Ubuntu的multiarch信息。您可以在软件包名称后附加:i386以安装其32位版本。 - TeTeT
1
我也遇到了这个问题,我需要ia32-libs来运行Fortinet VPN客户端,在10.04 LTS和12.04 LTS下它可以完美地工作。我尝试过“sudo apt-get install ia32-libs:i386”,但是不起作用,我还安装了“lib32z1 lib32ncurses5 lib32bz2-1.0”软件包,但它们也不起作用。 - javaPhobic
@javaPhobic 我决定安装ubuntu12.04(32位)。关于我的问题,我已经得到了一些答案。它们不是我的解决方案,但可能对您有所帮助。1. 您可以尝试使用make clean,然后再次编译您的代码。2. 您可以尝试安装整个ia32-libs,就像Mike Tang的回答一样。3. 您可以尝试在编译代码时添加“-m32”,例如:gcc -m32 helloworld.c。祝你好运。 - andycoder
这个问题应该在Server Fault讨论。 - AStopher
2
我投票关闭此问题,因为它涉及Linux库的位置。虽然与编程有关,但解决方案更多是关于Linux配置答案,而不是编程答案。 - BradleyDotNET
11个回答

140

你可以尝试这个方法来安装32位库(并非全部在ia32-libs中):

sudo  apt-get install program:i386
如果您以前从未执行过此操作,则可能需要使用 sudo dpkg --add-architecture i386 命令。
如果您想要安装整个 ia32-lib,请按照以下顺序进行尝试:
sudo -i
cd /etc/apt/sources.list.d
echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" >ia32-libs-raring.list
apt-get update
apt-get install ia32-libs

PS:这样你就可以安装 ia32-libs 了。不过,我们添加了13.04的源,因此可能会出现一些未知的问题。在安装完 ia32-libs 后,建议你删除 /etc/apt/sources.list.d 中的 ia32-libs-raring.list 文件,并执行 sudo apt-get update 命令。


如果你想解决 Android SDK 的依赖关系问题,可以尝试以下命令:

sudo apt-get install -y libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1


3
E: 包'ia32-libs'没有可安装的候选项。 - ThatAintWorking
2
我无法访问archive.ubuntu.com。在执行apt-get update时出现了很多“未找到”的情况。因此,我将软件包源更改为deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse。现在可以正常工作了。 - Tim Wu
3
Raring存档现在在Ubuntu存档中不可用。我已将Raring存档更改为Precise存档。现在将安装ia32-libs软件包。 - Martijn Burger
1
第二行是echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" >/etc/apt/sources.list.d/ia32-libs-raring.list。 - Vigen
我正在尝试为PlayOnLinux安装这个。它对我起作用了。 - Chris1804505
显示剩余2条评论

80

安装gcc多个库。

sudo apt-get install gcc-multilib

3
这个在14.04版本中的gcc-multilib元包是我目前发现最接近12.04版本中ia32-libs元包的一个可替代品,但它仍无法满足明确设置为ia32-libs的软件包依赖关系。 - quickthyme
7
无法赞同这个足够。从www.modern.ie提取Internet Explorer虚拟机需要这个和libstdc++6-4.7-dev:i386 - Tek
这仍然适用于Ubuntu 16.04(但我不知道它有多完整) - Peter
我还需要执行以下命令:sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 - Mike Godin
由于这篇文章和这个链接:https://unix.stackexchange.com/questions/407432/cups-reports-all-successful-but-nothing-prints-on-brother-hl-2240-series-usb-pr,我成功地在CUPS中设置了我的Brother DCP J152打印机。谢谢! - Josef Biehler

56

2
这完全是我的adb的问题(与clockworkmod carbon/helium捆绑在一起)。感谢您提供的答案,它对我的问题非常准确(虽然可能不是OP的问题^^)。而且,这个答案对我来说似乎更加干净。没有添加以前的Ubuntu版本存储库链接,这将在之后创建一个大混乱... - Dolanor
1
这对我也起了作用,我遇到了一个不太有帮助的错误(Google搜索结果也很少,所以祈祷这个被索引了):“error while loading shared libraries: libncurses.so.5”。谢谢! - Honoki
优秀的答案适用于Ubuntu 14.04,但在16.04上无法运行。 - Peter

29

我终于明白了!这是我的方法,希望能帮到你 :)

sudo apt-get install libc6:i386
sudo -i
cd /etc/apt/sources.list.d
echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" >ia32-libs-raring.list
apt-get update
apt-get install ia32-libs
rm /etc/apt/sources.list.d/ia32-libs-raring.list
apt-get update
exit
sudo apt-get install gcc-multilib

我不知道为什么需要安装这些,但它在我的电脑上起作用。当你完成安装这些软件包后,就可以尝试了。哦,是的,我需要告诉你。这一次编译代码时,你应该在gcc之后添加-m32,例如:gcc -m32 -o hello helloworld.c。只需执行make clean然后再次执行make。祝你好运。

PS:我的环境是Ubuntu 14.04 64位(Trusty Tahr),GCC版本为4.8.4。我在我的博客中写了解决方法,但它是用中文写的 :-) - 如何在Ubuntu 14.04下编译32位程序


对于实际需要执行此操作的人来说,这可能是显而易见的,但不要在rm语句中放入“/”。 - keefer
是的,这是我的错误。我已经修复了。谢谢~ @keefer - andycoder
2
-1:虽然这个方法可以工作,但是这是非常糟糕的做法。在这个AskUbuntu帖子中有更好的解决方案,不需要安装旧的存储库。这种方法只适用于非常老的二进制包。但是由于您拥有源代码,所以这种方法真的不合适。 - jmiserez
Raring存档在Ubuntu存档中已不可用。我已将Raring存档更改为Precise存档。现在将安装ia32-libs软件包。 - Zhenya
对我来说也是-1。你将面临许多来自2个版本的依赖问题。即使之后删除了raring引用。完全同意@jmiserez的观点。 - Dolanor
请勿混合两个来源进行翻译。请参见Aleksei提供的更好答案。 - joelparkerhenderson

20

这些替代库适用于我:

sudo apt-get update
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6

17

我遇到了与上述相同的问题,Eclipse 建议安装:

Hint: On 64-bit systems, make sure the 32-bit libraries are installed:   
   "sudo apt-get install ia32-libs"    
or on some systems,  
   "sudo apt-get install lib32z1"   

当我尝试安装ia32-libs时,Ubuntu提示我需要安装另外三个软件包:

$ sudo apt-get install ia32-libs  
Reading package lists... Done  
Building dependency tree         
Reading state information... Done  
Package ia32-libs is not available, but is referred to by another package.  
This may mean that the package is missing, has been obsoleted, or  
is only available from another source  
However the following packages replace it:  
  lib32z1 lib32ncurses5 lib32bz2-1.0  

E: Package 'ia32-libs' has no installation candidate  
$   
$ sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0    

在使用Android Studio和Intellij时,我还需要安装32位版本的libstdc++6:

sudo apt-get install lib32stdc++6

这对我来说似乎是解决方案,因为ia32-libs包已经过时了,而且它有效! - daniel souza
这个 lib32z1 无价的。 - zjk

8
对于我来说,我必须运行。
sudo dpkg --add-architecture i386

在运行Mike Tang的答案之前,请先执行此操作。否则,我无法安装ia32-libs。

4
只需安装程序的32位版本,而不是64位版本。这比安装不适用于该发行版的软件包要安全得多。我从Ubuntu 14.04上安装Google Earth的指南中得到了这个建议。Google Earth过去在64位Ubuntu 12.04下使用ia32-libs。引用webupd8.org的话:“由于Ubuntu 13.10开始ia32-libs包不再提供,该包被multiarch支持所取代,因此您不再需要它,但是一些(实际上是32位应用程序的)64位软件包仍然依赖于此软件包,因此在Ubuntu 14.04或13.10(64位)上无法安装...安装这些依赖于ia32-libs的应用程序的正确方法是简单地在Ubuntu 64位上安装32位软件包。当然,这将安装相当多的32位软件包,但这就是multiarch的工作方式。”像Google Earth这样的某些程序存在问题,即32位软件包不支持multiarch。因此,在Ubuntu 64位上运行程序的32位版本需要手动安装一些32位依赖项。
sudo dpkg --add-architecture i386 # only needed once
sudo apt-get update
sudo apt-get install libfontconfig1:i386 libx11-6:i386 libxrender1:i386 libxext6:i386 libgl1-mesa-glx:i386 libglu1-mesa:i386 libglib2.0-0:i386 libsm6:i386

2
sudo -i
cd /etc/apt/sources.list.d
echo "deb http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse" >ia32-libs-raring.list
apt-get update
apt-get install ia32-libs
rm /etc/apt/sources.list.d/ia32-libs-raring.list
apt-get update
exit

如果您在中国,可以将“raring”修改为“precise”(分别适用于Ubuntu 13.04(狂欢的狮尾)和Ubuntu 12.04 LTS(精准的穿山甲)})。我在Ubuntu 14.04(可信赖的塔尔)上安装了{{link3:Beyond Compare

1
问题在于很多情况下软件包已经是multiarch的,因此i386软件包不可用,但其他软件包仍然只依赖i386软件包。这是仓库中的一个问题,仓库管理员应该解决它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接