从OS X交叉编译到Linux

时间:2012-08-09 02:43:20

标签: linux macos gcc cross-compiling

我想从OS X 10.7 + Eclipse构建系统编译Linux服务器的二进制文件。这意味着GCC交叉编译器。我从原生4.7.1开始,为主持人拍摄4.7.1。

大多数在线说明都是针对嵌入式开发的。我想使用libstdc ++ - v3和glibc,这使它有点不同。

成功的是什么:

  1. 安装包

    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. 制作并安装binutils-2.22

  3. make all-gccmake install-gcc

    使用以下配置:

      

    $ ../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. 将构建环境指向交叉编译器

    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. 使用config

    构建glibc-2.16
      

    ../ 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

  6. 失败:

    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连接?

1 个答案:

答案 0 :(得分:1)

为了正确构建glibc,您需要来自Linux系统的头文件 - 可能内核头文件就足够了。

这是因为在该系统的软件的任何正常版本中都需要这些头文件,并且在交叉编译时也是如此。

自从我创建交叉编译器以来已经很长时间了,所以我不能告诉你如何使用glibc来构建标题,但我相信它可以直接进行。