2012-08-09 13 views
6

Ich möchte Binärdateien für einen Linux-Server von einem OS X 10.7 + Eclipse-Build-System kompilieren. Dies bedeutet einen GCC-Cross-Compiler. Ich beginne mit nativen 4.7.1 und schieße auf einen Host 4.7.1.Cross-kompilieren zu Linux von OS X

Die meisten Online-Anweisungen beziehen sich auf die Embedded-Entwicklung. Ich möchte libstdC++ - v3 und glibc verwenden, die es ein wenig anders machen.

Was folgt:

  1. Pakete installieren

    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. Fabrikat und installieren binutils-2,22

  3. make all-gcc und make install-gcc

    die folgende Konfiguration verwendet:

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

  4. Richten Sie die Build-Umgebung am Kreuz -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 mit der Config

    ../glibc/configure --host = x86_64-pc-linux-gnu --build = x86_64-apple-darwin11 --prefix =/usr/lokal/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

Das Scheitern:

glibc build schlägt in Kürze fehl. Diese Meldung wird häufig angezeigt:

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. 

Dies kann jedoch normal sein.

Dann kann es nicht stdio_lim.h produzieren. Mit make -d ich diese:

  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. 

Dies ist der erste Kopf es in bits aufzubauen versucht. Es gibt eine Datei stdio_lim.h.in, die die einzige .in Datei in ihrem Verzeichnis ist. Sollte eine Regel .st mit .in verbinden?

+0

@DietrichEpp Können Sie klären? Warum sollte ein Cross-Compiler etwas vom Host-Betriebssystem verlangen? Über die gesamte Toolchain ist grundsätzlich etwas sehr faul. Ist es ein Inszenierungsproblem? Wie der Versuch, Linux-Bibliotheken auf der nativen Plattform zu verwenden, um von Stufe 2 zu Stufe 3 zu gelangen? – Potatoswatter

+0

Sorry, ich habe es falsch gelesen. –

+0

Scheint, es würde Ihnen ein paar Tage Ihres Lebens sparen, nur um eine VM zu installieren. Cross-Compiling ist ein echter Bär. –

Antwort

1

Um glibc richtig zu erstellen, benötigen Sie die Header-Dateien von einem Linux-System - wahrscheinlich reichen die Kernel-Header aus.

Dies ist aufgrund der Tatsache, dass diese Header in jedem normalen Build der Software für das System benötigt werden, und das gleiche gilt nicht für Cross-Compiling.

Es ist lange her, seit ich an der Erstellung von Cross-Compilern gearbeitet habe, also kann ich Ihnen nicht sagen, wie man den Build von glibc bekommt, um die Header zu sehen, aber ich glaube, dass es auf einfache Art und Weise gemacht werden kann .

+0

Danke, ich könnte dies bald wiederholen, um diese Antwort zu überprüfen. – Potatoswatter

+0

Hast du es gelöst? – ash

+0

Sorry, bin nicht dazu gekommen. Momentan benutze ich kein Linux für irgendwas. Ich werde es hoffentlich in den nächsten Monaten tun. – Potatoswatter