从OS X交叉编译到Linux

6

我希望从OS X 10.7 + Eclipse构建系统为Linux服务器编译二进制文件,这意味着需要使用GCC交叉编译器。我从本地4.7.1版本开始,并且目标是主机4.7.1。

大多数在线指南都是针对嵌入式开发的,但我想使用libstdc++-v3和glibc,这使得情况有些不同。

成功的方法:

  1. Install packages

    port install gcc47
    export CC=gcc-mp-47
    export LD=ld-mp-47
    export CXX=g++-mp-47
    export CPP=cpp-mp-47
    
    port install gmake
    ln /opt/local/bin/gmake /opt/local/bin/make
    
    port install gsed
    ln /opt/local/bin/gsed /opt/local/bin/sed
    
    port install gawk
    port install autoconf
    port install msgfmt
    
  2. Make and install binutils-2.22

  3. make all-gcc and make install-gcc

    Used the following config:

    $ ../gcc/configure --enable-languages=c,c++,objc,obj-c++ --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --prefix=/usr/local/cross/linux --target=x86_64-pc-linux-gnu --disable-nls

  4. Point the build environment at the cross-compiler

    export CC=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-gcc
    export LD=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ld
    export AR=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-ar
    export CXX=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-g++
    export CPP=/usr/local/cross/linux/bin/x86_64-pc-linux-gnu-cpp
    
  5. Build glibc-2.16 using the config

    ../glibc/configure --host=x86_64-pc-linux-gnu --build=x86_64-apple-darwin11 --prefix=/usr/local/cross/linux/ --with-binutils=/usr/local/cross/linux/bin/ --with-headers=/usr/local/cross/linux/include/ libc_cv_forced_unwind=yes libc_cv_ctors_header=yes libc_cv_c_cleanup=yes

故障:

在很短的时间内,glibc构建失败。此消息会出现多次:

In file included from ./sysdeps/unix/sysdep.h:20:0,
                 from ./sysdeps/unix/x86_64/sysdep.h:18,
                 from sysdeps/unix/sysv/linux/x86_64/sysdep.h:22,
                 from <stdin>:1:
sysdeps/unix/sysv/linux/sys/syscall.h:24:24: fatal error: asm/unistd.h: No such file or directory
compilation terminated.

这可能是正常的情况。
然后它无法生成 stdio_lim.h。 我使用 make -d 命令,我得到了这个结果:
          Successfully remade target file `/Users/dkrauss/Documents/work/glibc-build/csu/abi-tag.h'.
          Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.
           File `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h' does not exist.
           Looking for an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.
           Trying pattern rule with stem `lim'.
           Trying implicit prerequisite `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'.
           Found an implicit rule for `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.
            Considering target file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'.
            Recently tried and failed to update file `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st'.
make[2]: *** No rule to make target `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.st', needed by `/Users/dkrauss/Documents/work/glibc-build/bits/stdio_lim.h'.  Stop.

这是它在bits中尝试构建的第一个标题。有一个名为stdio_lim.h.in的文件,它是其目录中唯一的.in文件。是否应该将.st.in连接起来?


似乎安装虚拟机可以节省你几天的时间。交叉编译真的很麻烦。 - Dietrich Epp
@DietrichEpp 哈哈,我仍然认为有些可疑,之前链接的问题提到glibc可能无法交叉编译。关于分阶段哲学的入门指南会很不错... - Potatoswatter
@DietrichEpp 是的,感谢您澄清。那么回到起点…为什么目标库是交叉编译器的先决条件呢? - Potatoswatter
@PaulDuBois 不,我只是在服务器上安装了GCC。如果你有一个服务器,那显然很好,但对于嵌入式系统或其他设备来说就不太适用了。 - Potatoswatter
它正在寻找Linux内核头文件。asm/unistd.h是Linux内核源代码的一部分。 - Rik Schneider
显示剩余6条评论
1个回答

1
为了正确构建glibc,您需要来自Linux系统的头文件 - 可能内核头文件就足够了。
这是由于在该系统的任何正常软件构建中都需要这些头文件,当进行交叉编译时也不例外。
我已经很久没有创建交叉编译器了,所以无法告诉您如何使glibc构建看到头文件,但我相信它可以用一种简单直接的方式完成。

谢谢,我可能很快会回来验证这个答案。 - Potatoswatter
抱歉,我还没来得及做。目前我没有在使用Linux做任何事情。希望在接下来的几个月内会使用它。 - Potatoswatter

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