2013-03-05 4 views
5

Ich habe Probleme beim Kompilieren einer Bibliothek für mein Arm Board mit Autconf.Kreuz Kompilieren für ARM mit Autoconf

Ich benutze diese Zeile:

./configure --target=arm-linux --host=arm-linux --prefix=/bla/bla/bla/linux_arm_tool CFLAGS='-m32' 
make 
make install 

Wenn ich file es zu überprüfen, die ich erhalten:

libjpeg.so.8.4.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped 

das nicht richtig überhaupt nicht erscheinen, aber ich versuchte es trotzdem verwenden. .. und ich bekomme:

/usr/lib/gcc/arm-linux-gnueabi/4.5.3/../../../../arm-linux-gnueabi/bin/ld: skipping incompatible /bla/bla/bla/bla/../linux_arm_tool/lib/libjpeg.so when searching for -ljpeg 

ich ratlos bin, habe ich jetzt seit einer Stunde googeln ...

Antwort

12

immer mit diesem so wusste ich, ich habe Kreuz zusammengestellt, bevor wirklich grundlegende Methodenaufrufe und ich herausgefunden, warum ich bekommen habe weg, bevor nach dem Ausgang der Prüfung:

checking for arm-linux-gnueabi-gcc... no 
checking for gcc... gcc 
... 
... 
checking for arm-linux-gnueabi-gcc... gcc 

In meinem /usr/bin kein arm-linux-gnueabi-gcc war, hatte ich zu:

ln -s /usr/bin/arm-linux-gnueabi-gcc-4.5 /usr/bin/arm-linux-gnueabi-gcc 

mit

ich erfolgreich Quer zusammengestellt:

./configure --host=arm-linux-gnueabi -prefix=${CSTOOL_DIR}/linux_arm_tool 

wie für die Verbindung ... Ich muss noch ein paar Dinge überprüfen, aber ich gehe davon aus, ich könnte müssen einige -rpath-link Flaggen in fortgeschritteneren compiles werfen.

+1

Ich habe nicht einmal "/usr/bin/arm-linux-gnueabi-gcc-4.5"! Aber ich habe es über "apt-get install gcc-arm-linux-gnueabi" installiert –

3

Sie müssen die Umgebungsvariablen CC, LD und andere relevante Werte überschreiben. diese Schalter Einstellung konfigurieren nicht sagen, wo Ihre Cross Toolkette ist (es könnte überall sein)

prüfen einige Führer für verschiedene Projekte, zum Beispiel: http://wiki.wxwidgets.org/Cross-Compiling_Under_Linux

Auch hier ist ein Skript, das ich gemacht Setup-Kreuz für node.js kompilieren - gleiche Idee: https://gist.github.com/edhemphill/5094239

Die libjpeg ist b nicht zur Arbeit gehen/c es eine x86 binary ist, können Sie es sagen müssen:

ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, not stripped 

oder ähnlich.

Dies ist der Grund, warum Sie ein skipping incompatible

+0

Ja, das macht Sinn, und so viel erwartet. Ich konnte einfach nicht herausfinden, wo das Kompilieren fehlschlug. Was ist der Sinn des Flags --target, wenn es nicht automatisch die richtigen Compiler und Linker verwendet? – Constantin

+2

Solange Sie nicht einen Compiler erstellen (mit Blick auf die 'libjpeg.so' erwähnt, glaube ich nicht), die' --target' Flag wird sowieso nicht von Nutzen sein. '--target' gibt die Architektur der Maschine an, für die die erzeugte Binärdatei eine Ausgabe generiert. So würde ein Assembler, der auf Maschine A erstellt wurde, die später auf Maschine B läuft, um Code für Maschine C zu assemblieren, verwenden: --buid = A - Host = B - Ziel = C. Wenn die generierte Binärdatei keinen Code generiert, ändert das Flag "--target" nichts. – mikyra

+0

Also soll ich das gesamte Makefile über Umgebungsvariablen einrichten, bis hin zu den Linker-Flags wie '-rlink-path'? – Constantin

5

Ich denke, das Problem könnte allgemeiner gesagt werden als: "Wie verwende ich Autoconf, um für ARM zu kompilieren?"

Nach ./configure -h:

System types: 
    --build=BUILD  configure for building on BUILD [guessed] 
    --host=HOST  cross-compile to build programs to run on HOST [BUILD] 

Die offizielle GNU Dokumentation hilfreich ist, diese Frage zu beantworten:

http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Hosts-and-Cross_002dCompilation.html

Hinweis, wenn sie die Nutzung von --host definieren und und --build:

Therefore, whenever you specify --host, be sure to specify --build too. 

Und hier ist ein Beispiel, das ich nur verwendet, um iperf für meine Embedded ARM-Plattform zu konfigurieren:

Zunächst wird die „configure“ Skript ist eigentlich ‚Autoconf‘ genannt, die für Google-ing wirklich hilft. Die Idee dabei ist:

  • Haben Sie Ihre Cross-Compiler in der aktuellen $ PATH
  • Stellen Sie die CC und CXX Umgebungsvariablen zu dem Cross-Compiler
  • das Recht geben, --host und darauf hinzuweisen - -build

    buildpath <--- my little script to setup my $PATH 
    export CC=arm_v5t_le-gcc 
    export CXX=arm_v5t_le-g++ 
    ./configure --host=armv5tl-montavista-linux-gnueabi --build=x86_64-linux-gnu