Wie kann ich beim Cross-Compiling mit externen Bibliotheken arbeiten?

Lesezeit: 6 Minuten

Benutzeravatar von Punit Soni
Punit Soni

Ich schreibe einen Code für das Raspberry Pi ARM-Ziel auf einem x86-Ubuntu-Computer. Ich verwende die Toolchain gcc-linaro-armhf. Ich bin in der Lage, einige unabhängige Programme auf pi zu kompilieren und auszuführen. Jetzt möchte ich meinen Code mit einer externen Bibliothek wie ncurses verknüpfen. Wie kann ich das erreichen.

Soll ich mein Programm einfach mit der vorhandenen ncurses-Bibliothek auf dem Hostcomputer verknüpfen und dann auf ARM ausführen? (Ich glaube nicht, dass das funktionieren wird) Muss ich den Quellcode oder die vorgefertigte Version von lib for arm besorgen, sie in meinen lib-Pfad einfügen und dann kompilieren?

Was ist die beste Vorgehensweise in einer solchen Situation?

Ich möchte auch wissen, wie es für die c stdlib funktioniert. In meinem Programm habe ich die stdio-Funktionen verwendet und es hat nach dem Cross-Compiling funktioniert, ohne etwas Besonderes zu tun. Ich habe gerade den Pfad für meinen Arm gcc im Makefile angegeben. Also, ich möchte wissen, wie es die richtigen Std-Header und Bibliotheken bekommen hat?

Zu deinen allgemeinen Fragen:

Warum die C-Bibliothek funktioniert:

Die C-Bibliothek ist Teil Ihrer Cross-Toolchain. Deshalb werden die Header gefunden und das Programm korrekt verlinkt und ausgeführt. Dies gilt auch für einige andere sehr einfache Systembibliotheken wie libm und libstdc++ (nicht in jedem Fall, hängt von der Toolchain-Konfiguration ab).

Im Allgemeinen benötigen Sie bei der Cross-Entwicklung eine Möglichkeit, Ihre gewünschten Bibliotheken cross-kompiliert zu bekommen. Die Verwendung von Binärdateien ist in diesem Fall sehr selten. Das heißt, insbesondere bei ARM-Hardware, da es so viele verschiedene Konfigurationen gibt und oft alles auf unterschiedliche Weise stark reduziert wird. Aus diesem Grund sind Binärdateien zwischen verschiedenen Geräten und Linux-Konfigurationen nicht sehr binärkompatibel.

Wenn Sie Ubuntu auf dem Raspberry Pi ausführen, besteht die Möglichkeit, dass Sie eine geeignete Ncurses-Bibliothek im Internet oder sogar in einem Ubuntu-Apt-Repository finden. Der typische Weg wird jedoch sein, die Bibliothek mit der spezifischen Toolchain, die Sie haben, zu kompilieren.

Wenn viele und komplexe Bibliotheken crosskompiliert werden müssen, gibt es Lösungen, die das Leben etwas einfacher machen, wie buildroot oder ptxdist. Diese Programme erstellen vollständige Linux-Kernel und Root-Dateisysteme für eingebettete Geräte.

In Ihrem Fall können Sie jedoch den Quellcode selbst kompilieren, solange Sie nur ncurses möchten. Sie müssen nur die Quellen herunterladen, ausführen configure während Sie Ihre Toolchain mit der angeben --host Möglichkeit. Das --prefix Option wählt das Installationsverzeichnis. Nach dem Rennen make und make installWenn alles gut gelaufen ist, haben Sie eine Reihe von Headern und die ARM-kompilierte Bibliothek, mit der Ihre Anwendung verknüpfen kann.

Bezüglich Cross Compilation finden Sie sicher jede Menge Informationen im Internet und vielleicht hat auch ncurses einige Hinweise in seiner mitgelieferten Dokumentation.

  • Danke, das war hilfreich. Noch eine allgemeine Frage. Bezüglich der C-Bibliotheken habe ich im Makefile keinen Pfad angegeben. Ich habe gerade den Pfad zu arm-gcc angegeben, woher weiß es also, wo es die stdlib findet. Ich weiß, dass ich für externe Bibliotheken den Pfad mit -L angeben kann.

    – Punit Soni

    19. September 2013 um 19:07 Uhr


  • @PunitSoni arm-gcc berechnet sich selbst gemäß dem relativen Pfad, sodass Sie die Verzeichnisstruktur Ihres Cross-Compilers nicht ändern können

    – Zifer

    29. April 2016 um 8:34 Uhr

  • könnte helfen, ein Beispiel dafür zu geben, wie diese Optionen (--host, --prefix) Arbeit.

    – Michael

    20. Oktober 2016 um 22:58 Uhr

Für die Abfrage How the C library works in cross-tools

Beim Kompilieren und Erstellen einer Cross-Tool-Kette während der Konfiguration wird Sysroot bereitgestellt.

wie --with-sysroot=${CLFS_CROSS_TOOLS}

--with-sysroot
--with-sysroot=dir

Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.

Also statt suchen /lib /usr/include es sieht /Toolchain/(libc) und (include files) aus, wenn es kompiliert wird

Sie können vorbeischauen

arm-linux-gnueabihf-gcc -print-sysroot

diese zeigen, wo Sie nach libc suchen müssen.

Auch

arm-linux-gnueabihf-gcc -print-search-dirs

gibt Ihnen ein klares Bild

  • Danke, das macht Sinn.

    – Punit Soni

    21. September 2013 um 7:04 Uhr

  • Wenn ich also ein ISO für mein eingebettetes System habe, kann ich dieses ISO mounten (schreibgeschützt) und –with-sysroot verwenden, um den Cross-Compiler dazu zu bringen, all diese Systembibliotheken beim Erstellen neuer Pakete zu verwenden?

    – Pavillon

    14. Juli 2021 um 16:21 Uhr

Offensichtlich benötigen Sie eine ncurses kompiliert für den ARM, auf den Sie abzielen – der auf dem Host wird Ihnen absolut nichts nützen [unless your host has an ARM processor – but you said x86, so clearly not the case].

Es KÖNNEN einige vorgefertigte Bibliotheken verfügbar sein, aber ich vermute, es ist mehr Arbeit, eine zu finden (die funktioniert und Ihren spezifischen Bedingungen entspricht), als die Bibliothek selbst aus Quellen zu erstellen – es sollte nicht so schwer sein, und ich gehe davon aus ncurses dauert nicht so viele Minuten, um zu bauen.

  • Danke, ich wollte nur bestätigen, dass dies der beste Weg ist, es zu tun. Wie funktioniert die stdlib in diesem Fall? Ich habe die stdlib für ARM hier nicht kompiliert oder verlinkt.

    – Punit Soni

    19. September 2013 um 19:02 Uhr

Zu Ihrer ersten Frage: Wenn Sie beabsichtigen, die ncurses-Bibliothek mit Ihrer Cross-Compiler-Toolchain zu verwenden, müssen Sie die von Arm erstellten Binärdateien vorbereiten.

Ihre zweite Frage ist, wie es mit std libs funktioniert, nun, es ist wirklich NICHT das System libc/libm, das die Toolchain zum Kompilieren/Linken Ihres Programms verwendet. Vielleicht siehst du es von –-print-dateiname= Option Ihres Compilers:

arm-none-linux-gnuabi-gcc --print-file-name=libm.a

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a

arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so

Ich denke, Ihre Raspberry-Toolchain könnte die gleiche sein. Sie können dies ausprobieren.

Benutzeravatar von anaken78
anaken78

Vinays Antwort ist ziemlich solide. Nur eine Korrektur beim Kompilieren der Ncurses-Bibliothek für Himbeer-Pi ist die Option zum Festlegen Ihrer Rootfs --sysroot=<dir> und nicht --with-sysroot . Das habe ich gefunden, als ich den folgenden Compiler verwendet habe:

arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (prerelease)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1389210cookie-checkWie kann ich beim Cross-Compiling mit externen Bibliotheken arbeiten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy