【问题标题】:What determines if a 32-bit library built on a 64-bit machine needs x86_64 or i386 dependencies?什么决定了在 64 位机器上构建的 32 位库是否需要 x86_64 或 i386 依赖项?
【发布时间】:2017-09-19 00:55:35
【问题描述】:

我正在更新一些旧的 C++ 项目以首次在 64 位 Linux 机器上构建,我没有太多 Linux 经验。我需要将所有内容构建为 32 位二进制文​​件,因此我在编译器和链接器标志中使用 -m32 构建所有内容。我发现,在链接到它们的依赖项时,有些必须链接到 i386 共享对象,有些必须链接到 x86_64 共享对象。如果我只在链接路径中包含错误的文件夹 (-L/path/to/wrong/folder),它会说

/usr/bin/ld: skipping incompatible xxx.so when searching for -lxxx

我已经明白了means the architecture doesn't match what I'm trying to build

对于两个如此不同的项目,makefile 几乎相同,因此我似乎没有在那儿做明显错误的事情,并且-m32 出现在终端中对gccg++ 的调用中。什么可能导致这种差异?我应该担心,还是这种情况很常见?

如果需要更多信息来回答,请告诉我;由于对Linux和gcc缺乏经验,我不太确定,所以提前道歉。

【问题讨论】:

  • 如果您正在构建 32 位可执行文件,则必须链接到 32 位库。如果您在链接到 32 位库时遇到错误,则说明过程中出现了问题,您需要向我们提供更多详细信息。
  • 在您的 .o 文件上运行 file,它会告诉您它们是 32 位还是 64 位。 (如果您使用 -m32 构建,它们应该是 32 位的。)

标签: c++ linux gcc linker g++


【解决方案1】:

感谢@Wyzard 和@duskwuff 的提示。通过在我的 .o 文件上使用 file,我确实能够找到我的问题。这只是一个愚蠢的错误。我无意中恢复了我对其中一个项目的make 文件所做的更改,其中包括添加了-m32 标志。我想我误解了“x86_64”库的用途,这让我很困惑(我以为它的意思是“64 位机器的 32 位进程”)。

【讨论】:

  • (我最初在 2017 年 4 月 24 日的问题 cmets 中发布了这个并投票结束了我自己的问题,但是在发布后很久有人投票支持它,所以我猜这个问题和方式它已解决,无论如何都帮助了他们......因此,我将添加这个社区维基答案。)
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 2012-03-08
  • 2014-11-27
  • 1970-01-01
  • 2013-11-07
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多