Come lavorare con le librerie esterne durante la compilazione incrociata?

Sto scrivendo un codice per il target ARM raspberry pi su macchina ubuntu x86. Sto usando la toolchain gcc-linaro-armhf. Sono in grado di compilare e compilare programmi indipendenti su pi. Ora, voglio colbind il mio codice con una libreria esterna come ncurses. Come posso raggiungere questo objective.

Dovrei semplicemente colbind il mio programma con la lib di ncurses esistente sulla macchina host e quindi eseguire su ARM? (Non penso che funzionerà) Devo ottenere la versione sorgente o prebuilt di lib per arm, inserirla nel mio percorso lib e quindi compilare?

Qual è la migliore pratica in questo tipo di situazione?

Voglio anche sapere come funziona per il c stdlib. Nel mio programma ho usato le funzioni stdio e ha funzionato dopo la compilazione incrociata senza fare nulla di speciale. Ho appena fornito il percorso per il mio arm gcc nel makefile. Quindi, voglio sapere come ha ottenuto le intestazioni e le librerie std corrette?

Per quanto riguarda le tue domande generali:

Perché la libreria C funziona:

La libreria C fa parte della tua croce toolchain. Ecco perché vengono trovate le intestazioni e il programma si collega e corre correttamente. Questo vale anche per alcune altre librerie di sistema molto semplici come libm e libstdc ++ (non in ogni caso, dipende dalla configurazione della toolchain).

In generale, quando si ha a che fare con lo sviluppo incrociato, è necessario un modo per ottenere le librerie desiderate compilate in modo incrociato. L’uso dei binari in questo caso è molto raro. Cioè, specialmente con l’hardware ARM, perché ci sono così tante diverse configurazioni e spesso tutto viene ridotto molto in modi diversi. Ecco perché i binari non sono molto compatibili binari tra diversi dispositivi e configurazioni Linux.

Se stai usando Ubuntu sul Raspberry Pi, c’è la possibilità che tu possa trovare una libreria di ncurses adatta su internet o persino in qualche repository di Ubuntu apt. Il modo tipico, tuttavia, sarà di compilare la libreria con la toolchain specifica che hai ottenuto.

Nei casi in cui molte librerie complesse e complesse devono essere compilate in modo incrociato, esistono soluzioni che rendono la vita un po ‘più semplice come buildroot o ptxdist. Questi programmi creano kernel Linux completi e file system di root per dispositivi embedded.

Nel tuo caso, tuttavia, purché tu voglia solo ncurses puoi compilare il codice sorgente tu stesso. Devi solo scaricare i sorgenti, eseguire configure mentre specifichi la tua toolchain usando l’opzione --host . L’opzione --prefix sceglierà la directory di installazione. Dopo aver eseguito make e make install , considerando che tutto è andato per il verso giusto, avrai a disposizione una serie di intestazioni e la libreria compilata da ARM per la tua applicazione.

Per quanto riguarda la compilazione incrociata, troverai sicuramente molte informazioni su Internet e forse anche ncurses ha alcuni suggerimenti nella sua documentazione spedita.

Per la query How the C library works in cross-tools

Quando si compila e si costruisce una catena di strumenti a croce durante la configurazione, forniranno sysroot.

come --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.

Quindi, invece di guardare /lib /usr/include sembrerà / Toolchain / (libc) e (include files) quando la sua compilazione

puoi controllare

arm-linux-gnueabihf-gcc -print-sysroot

questo spettacolo dove cercare libc.

anche

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

ti dà un’immagine chiara

Chiaramente, avrete bisogno di un ncurses compilato per l’ARM che avete scelto come target: quello sull’host non vi farà assolutamente nulla di buono [a meno che l’host non abbia un processore ARM, ma avete detto x86, quindi chiaramente non è il caso].

Potrebbero esserci alcune librerie predefinite disponibili, ma sospetto che sia più utile trovarne una (che funzioni e corrisponda alle condizioni specifiche) piuttosto che build la libreria da soli – non dovrebbe essere così difficile, e mi aspetto che ncurses non ncurses prenditi tanti minuti per build.

Per quanto riguarda la tua prima domanda, se hai intenzione di usare la libreria ncurses con il tuo cross-compiler toolchain, avrai i suoi binari arm-ready preparati.

La tua seconda domanda è come funziona con le librerie std, beh, in realtà NON è il libc / libm di sistema che la toolchain sta usando per compilare / colbind il tuo programma. Forse lo vedrai da – -print-file-name = opzione del tuo compilatore:

 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 

Penso che il tuo toolchain Raspberry potrebbe essere lo stesso. Puoi provarlo.

La risposta di Vinay è piuttosto solida. Solo una correzione durante la compilazione della libreria ncurses per raspberry pi l’opzione per impostare il tuo rootfs è --sysroot=

e non --with-sysroot . Questo è quello che ho trovato quando stavo usando il seguente compilatore:

 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.
 Questo è software libero;  vedere la fonte per le condizioni di copia.  Non c'è
 garanzia;  nemmeno per COMMERCIABILITÀ o IDONEITÀ PER UN PARTICOLARE SCOPO.