2

我正在尝试使用来自http://crossgcc.rts-software.org/doku.php?id=i386linuxgccformac的文件制作交叉编译器

我在 Intel Mac (10.6.6, x86_64) 我编译:gmp, mpfr, mpc for the cross compiler as 32bit (因为我在 64bit Mac上) 但我得到了

ld: warning: option -s is obsolete and being ignored
ld: warning: ignoring file /gmp1/lib/libmpc.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: ignoring file /gmp1/lib/libmpfr.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: ignoring file /gmp1/lib/libgmp.dylib, file was built for unsupported file format which is not the architecture being linked (i386)

编译 GCC 时:

--prefix=/usr/local/i386-linux-4.5.2 --target=i386-linux --enable-languages=c --without-headers --disable-shared --disable-threads --disable-nls --with-gmp=/gmp1 --with-gmp-lib=/gmp1 --with-gmp-include=/gmp1 --with-mpfr=/gmp1 --with-mpfr-include=/gmp1 --with-mpfr-lib=/gmp1 --with-mpc=/gmp1 --with-mpc-lib=/gmp1 --with-mpc-include=/gmp1

另外,如果我编译 GMP:

./configure --prefix=/gmp1 --host=i386-linux

我得到:

configure: WARNING: +----------------------------------------------------------
configure: WARNING: | Cannot determine global symbol prefix.
configure: WARNING: | link -dump -symbols output doesn't contain a global data symbol.
configure: WARNING: | Will proceed with no underscore.
configure: WARNING: | If this is wrong then you'll get link errors referring
configure: WARNING: | to ___gmpn_add_n (note three underscores).
configure: WARNING: | In this case do a fresh build with an override,
configure: WARNING: |     ./configure gmp_cv_asm_underscore=yes
configure: WARNING: +----------------------------------------------------------
checking how to switch to read-only data section... .data
checking for assembler .type directive... 
checking for assembler .size directive... 
checking for assembler local label prefix... configure: WARNING: "link -dump -symbols" failure
configure: WARNING: cannot determine local label, using default L
L
checking for assembler byte directive... .byte
checking how to define a 32-bit word... link: illegal option -- d
4

2 回答 2

6

我认为您对应该为哪个平台编译哪个包感到困惑:

  • GCC 需要为 x86_64 MacOS X 主机和 i386-linux 目标编译。

  • GMP、MPC 和 MPFR 是 GCC 的运行时依赖项。因此,在您的情况下,它们还需要为 GCC 主机 - x86_64 进行编译。因此,--host=i386-linuxGMP configure 命令中的选项不正确。

一般来说,只有那些将在 GCC 编译的程序中链接的库才需要为交叉编译器目标(例如 i386-linux)构建。GMP 和 MPFR 不是这样的库,除非您的程序实际使用它们 - 在这种情况下,您将需要两个此类库的副本,一个用于 GCC,一个用于目标的交叉构建。

编辑:

你考虑过使用MacPorts吗?它具有交叉编译器的所有依赖项:

还有一个旧的基于 newlib 的交叉编译器i386

即使您不想使用这些,您仍然可以查看其 Portfile 中的构建说明。

底线是:

  • 应用这些库需要的任何补丁——MacPorts 已经这样做了。

  • 为您的构建主机编译库,即 MacOSX/x86_64。这意味着在--host他们的配置调用的任何选项中,您应该符合--host=x86_64-darwin(或任何您的主机需要)。如果 configure 可以自己找出主机,则可以--host完全跳过这些选项。

  • 编译 GCC--host作为您的构建主机(64 位 Mac OS X)和 i386-linux 的目标,例如--target=i386-linux. 如果我是你,我会从只针对 C 和 C++ 语言的编译器开始。

另请参阅本教程。它有一些关于如何使用适当的 glibc 生成工作工具链的信息。

也就是说,我认为你最好在虚拟机中安装一个合适的 Linux 发行版,原因有很多。您是否有理由特别需要交叉编译器?你想用那个编译器做什么?

于 2011-03-09T12:10:35.247 回答
0

编译 GMP 时是否使用了“ABI=32”选项?如果不是,我认为即使主机/目标指定为 i386,它也会使用 64 位代码。

于 2011-03-08T04:14:53.817 回答