【问题标题】:What's the OSX equivalent to Linux g++-multilib?与 Linux g++-multilib 等效的 OSX 是什么?
【发布时间】:2013-09-16 17:50:52
【问题描述】:

我是新手,我正在尝试将 64 位编译文件链接到 32 位目标文件,但出现此错误:

ld:警告:忽略文件 Estudiant.o,文件是为不受支持的文件格式构建的(0x7f 0x45 0x4c 0x46 0x 1 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0)这不是被链接的架构(x86_64):Estudiant.o 架构 x86_64 的未定义符号:

我想我需要在 linux 中安装 g++-multilib,但我找不到 osx 的等价物。有谁知道如何解决这个问题?

【问题讨论】:

  • 只用相同的架构编译所有东西,即全部 32 位或全部 64 位。
  • 只是给了我一个带有课程的 32 位编译对象,我不知道如何使它与我的 64 位机器和其他文件一起工作。而且我无法再次编译它,因为他们没有给我们代码文件(file.cpp)。有没有办法在osx上解决这个问题?我知道您可以在 linux 上安装 multilib 并使用 -m32 使其工作,但这在 osx 上不起作用。
  • 是的,只需编译为 gcc -m32 ... 即可获得与您的 32 位 Estudiant.o 目标文件链接的 32 位可执行文件。 (顺便说一句,我希望Estudiant.o 是一个 OS X 32 位目标文件,而不是用于 Linux 的东西?)

标签: c++ macos compilation g++


【解决方案1】:

在 Linux 和 OS X 上,您只能将所有 64 位目标文件和库链接在一起,或者将所有 32 位目标文件和库链接在一起。关于库,两种操作系统使用不同的方法来管理 32 位和 64 位的共存。

在 Linux 上,使用 multilib-approach,其中 bot 有 32 位和 64 位版本的同一库,通常具有相同的名称但位于两个不同的目录中,例如/lib 和 /lib64。

在 OS X 上,使用 fat-binary 方法,其中单个库或可执行文件同时包含 32 位和 64 位目标文件,所有这些文件都在一个文件中(几年前会有包含到 4 个不同版本的所有内容,PPC 32、PPC 64、x86 32、x86 64)。

这就是为什么在 OS X 上没有直接等效于 multilib 的原因,你没有多个库只是因为你需要 32 位和 64 位!

要构建应用程序,您需要始终将所有目标文件构建为 32 位或 64 位(就像在 Linux 上一样,您不能在任一系统上混合使用),然后,希望所有库使用包含(至少)您需要的版本。否则,您需要开始研究构建所需的库,但系统附带的大多数内容都应支持 32 位和 64 位。

【讨论】:

  • 好的,如果我在 Linux (Estudiant.o) 上制作和编译了一个 32 位对象,该对象用于我制作的文件 (red1.cpp),这不应该吗? g++ -m32 -c red1.cpp g++ -m32 -o red1.exe red1.o Estudiant.o 当我这样做时,我得到了同样的错误。这是否意味着 Estudiant.o 不兼容?
  • @tukair 您不能将在 Linux 上编译的目标文件与在 OS X 上编译的目标文件混合在一起。虽然两者都是 Unix(类),并且就基础而言,在编程时源代码兼容C、目标文件格式完全不同,不兼容。
猜你喜欢
  • 2013-07-16
  • 2014-03-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2012-12-04
  • 2019-06-26
相关资源
最近更新 更多