2012-08-09 8 views
6

Voglio compilare i binari per un server Linux da un sistema di build di OS X 10.7 + Eclipse. Ciò significa un cross-compiler GCC. Sto iniziando da nativo 4.7.1 e scatto per un host 4.7.1.Cross-compile a Linux da OS X

La maggior parte delle istruzioni online sono specifiche per lo sviluppo integrato. Voglio usare libstdC++ - v3 e glibc, che lo rendono un po 'diverso.

Cosa succede:

  1. installare i pacchetti

    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. fare e installare binutils-2,22

  3. make all-gcc e make install-gcc

    Usato seguente configurazione:

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

  4. punto l'ambiente di generazione alla croce -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. Corporatura glibc-2.16 utilizzando il 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 yes libc_cv_ctors_header = libc_cv_c_cleanup = yes

Il fallimento:

la creazione di glibc fallisce presto. Questo messaggio viene visualizzato più volte:

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. 

Questo può essere normale, tuttavia.

Quindi non riesce a produrre stdio_lim.h. Con make -d, ottengo questo:

  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. 

Questo è il primo di testa tenta di costruire in bits. C'è un file stdio_lim.h.in, che è l'unico file .in nella sua directory. Alcune regole dovrebbero essere collegate a .st a .in?

+0

@DietrichEpp Potete chiarire? Perché un compilatore incrociato dovrebbe richiedere qualcosa dal sistema operativo host? C'è qualcosa di molto sospetto in linea di principio sull'intera toolchain. È un problema di allestimento? Come provare ad usare le librerie Linux sulla piattaforma nativa per andare dalla fase 2 alla fase 3? – Potatoswatter

+0

Scusa, ho letto male. –

+0

Sembra che ti farebbe risparmiare qualche giorno della tua vita per installare una VM. La compilazione incrociata è un vero orso. –

risposta

1

Per creare correttamente glibc, sono necessari i file di intestazione da un sistema Linux - probabilmente le intestazioni del kernel sono sufficienti.

Ciò è dovuto al fatto che tali intestazioni sono necessarie in qualsiasi build normale del software per tale sistema e lo stesso non è diverso quando si esegue la compilazione incrociata.

E 'passato molto tempo da quando ho lavorato alla creazione di cross-compilers, quindi non posso dirvi come ottenere la build di glibc per vedere le intestazioni, ma credo che si possa fare in modo diretto .

+0

Grazie, potrei rivederlo presto per verificare questa risposta. – Potatoswatter

+0

Hai risolto? – ash

+0

Scusa, non ci sono riuscito. Al momento non sto usando Linux per niente. Spero che lo farò nei prossimi mesi. – Potatoswatter