Wie die Arbeit mit externen Bibliotheken beim cross-kompilieren?
Ich bin schreiben einige code für den raspberry pi ARM-target auf x86 ubuntu-Rechner. Ich bin mit dem gcc-linaro-armhf toolchain. Ich bin in der Lage, cross-kompilieren Sie und führen Sie einige unabhängige Programme auf pi. Nun möchte ich link mein code mit externe library wie ncurses. Wie kann ich das erreichen.
Sollte ich einfach den link zu meinem Programm die vorhandenen ncurses-lib auf dem host-Maschine und führen Sie dann auf den ARM? (Ich glaube nicht, dass das funktionieren wird)
Brauche ich für den Quell-oder vorkonfigurierte version der lib für arm, legte es in meine lib-Pfad und dann kompilieren?
Was ist die beste übung in dieser Art von situation?
Außerdem möchte ich wissen, wie es funktioniert für die c-stdlib. In meinem Programm benutzte ich die stdio-Funktionen und es funktionierte nach dem cross-kompilieren, ohne irgendetwas besonderes. Ich habe nur den Pfad für meine arm-gcc im makefile. So, ich will wissen, wie es korrekt std-Header und libs?
InformationsquelleAutor Punit Soni | 2013-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bezug auf Ihre Allgemeinen Fragen:
Warum die C-Bibliothek funktioniert:
Die C-Bibliothek ist Teil der cross-toolchain. Das ist, warum die Header sind gefunden und das Programm korrekt links und läuft. Dies gilt auch für einige andere sehr grundlegende system von Bibliotheken wie libm und libstdc++ (nicht in jedem Fall ist, hängt von der toolchain-Konfiguration).
Allgemein beim Umgang mit cross-Entwicklung müssen Sie einige Weg, um Ihre gewünschten Bibliotheken cross-kompiliert. Mit Binärdateien in diesem Fall ist sehr selten. Das ist, vor allem mit ARM-hardware, weil es so viele unterschiedliche Konfigurationen und oft ist alles abgespeckte viel verschiedene Möglichkeiten. Das ist, warum Binärdateien sind nicht sehr viel binärkompatibel zwischen verschiedenen Geräten und Linux-Konfigurationen.
Wenn Sie mit Ubuntu auf dem Raspberry Pi dann gibt es eine chance, dass Sie möglicherweise finden Sie einen geeigneten ncurses-Bibliothek im internet oder auch in einigen Ubuntu-apt-repository. Die typische Art und Weise, jedoch werden, um cross-kompilieren der Bibliothek mit der spezifischen Werkzeuge, die Sie haben.
In den Fällen, wenn viele und komplexe Bibliotheken müssen cross-kompiliert werden, es gibt Lösungen, die das Leben ein bisschen einfacher wie buildroot oder unter der Haube. Diese Programme bauen, komplette Linux-Kernel und root file Systeme für embedded-Geräte.
In deinem Fall aber so lange, wie Sie wollen, nur ncurses-kompilieren Sie den source-code selbst. Sie müssen nur zum download der Quellen, führen
configure
unter Angabe Ihrer toolchain mit der--host
option. Die--prefix
option wählen, wird das Installations-Verzeichnis. Nach dem ausführenmake
undmake install
, wenn man bedenkt alles ging gut, Sie haben einen Satz von Kopf-und ARM-kompilierte Bibliothek für Ihre Anwendung zu link gegen.Bezüglich cross-compilation findest du sicher viele Informationen im internet und vielleicht ncurses hat einige Hinweise in seiner Dokumentation ausgeliefert, zu.
arm-gcc wird versteht sich selbst entsprechend relativen Pfad, so dass Sie nicht ändern können die Verzeichnis-Struktur Ihres cross-compiler
helfen könnte, um ein Beispiel zu geben, wie diese Optionen (
--host
,--prefix
) arbeiten.InformationsquelleAutor gerrit zijlstra
Für die Abfrage
How the C library works in cross-tools
Beim kompilieren und bauen cross-tool-chain während der Konfiguration werden Sie bieten sysroot.
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.
Anstatt also auf der Suche
/lib /usr/include
es Aussehen wird /Toolchain/(libc) und (include-Dateien), wenn seine Zusammenstellungkönnen Sie überprüfen, indem
arm-linux-gnueabihf-gcc -print-sysroot
diese show, wo man die libc .
auch
arm-linux-gnueabihf-gcc -print-search-dirs
gibt man klares Bild
InformationsquelleAutor vinay hunachyal
Deutlich, brauchen Sie eine
ncurses
zusammengestellt für den ARM, die Sie sind targeting - die auf der host-tun Sie absolut nicht gut ist [es sei denn Ihr Gastgeber hat einen ARM-Prozessor, aber Sie sagte x86, also eindeutig nicht der Fall ist].KANN es einige vorgefertigte Bibliotheken zur Verfügung, aber ich vermute, es ist mehr Arbeit zu finden (das klappt und entspricht Ihren spezifischen Bedingungen) als zu bauen, die die Bibliothek selbst aus den Quellen - es sollte nicht so schwer sein, und ich erwarte, dass
ncurses
braucht nicht viele Minuten, um zu bauen.InformationsquelleAutor Mats Petersson
Als zu deiner ersten Frage, wenn Sie beabsichtigen, die ncurses-Bibliothek mit cross-compiler-toolchain, müssen Sie Ihre arm-built binaries bereit.
Ihre zweite Frage ist wie funktioniert das mit std libs, gut, es ist wirklich NICHT der system-libc/libm der toolchain verwendet, um Compiler - /link-Ihr Programm ist. Vielleicht sehen Sie es aus --print-file-name= Compileroption:
Ich denke, deine Himbeer-toolchain ist die gleiche. Sie können dies ausprobieren.
InformationsquelleAutor TwoCode
Vinay s Antwort ist ziemlich solide. Nur eine Korrektur bei der Erstellung der ncurses-Bibliothek für den raspberry pi die option aus, um Ihr rootfs ist
--sysroot=<dir>
und nicht--with-sysroot
. Das ist, was ich fand, als ich mit den folgenden compiler:InformationsquelleAutor anaken78