2012-08-03 8 views
7

Ho bisogno di compilare una libreria C/C++. La libreria dipende da diverse librerie C/C++. Alcune di quelle delle librerie a loro volta dipendono da altre librerie. Tutte le librerie vengono con lo script configure. So come compilare e installare le librerie sul sistema host - installare le dipendenze prima della lib di cui ho bisogno. Ovviamente questo non funzionerà durante la cross-compiling. Qualsiasi consiglio è apprezzato. Grazie.Come cross-compilare C++ - libreria con dipendenze?

risposta

8

In genere, per compilare un pacchetto autotracciato, passare un paio di argomenti aggiuntivi a ./configure: --host e --build. --host è il nome del sistema su cui verranno eseguiti i programmi creati e --build è il nome del sistema che esegue la compilazione.

Quando dico "nome del sistema", intendo una tupla del modulo ARCH-VENDOR-OS-LIBC. (Ad esempio, i686-pc-linux-gnu è la tupla che descrive il sistema attualmente in uso.) Talvolta parti della tupla vengono eliminate, come nel caso della toolchain mingw32 (sul mio sistema, gli strumenti cross mingw32 sono installati con la tupla i586-mingw32msvc e/o amd64-mingw32msvc).

(C'è un altro argomento per configurare, --target, che è per compilatori cross-compilazione e specifica il sistema che il compilatore in costruzione si rivolgerà durante la generazione del codice.)

Ogni toolchain ha la propria sotto /usr come /usr/i586-mingw32msvc. Stai per voler installare nuovi pacchetti qui in modo che vengano trovati. Utilizzare l'argomento --prefix su configure.

Così la compilazione incrociata dal mio sistema GNU/Linux a un sistema mingw32, vorrei correre configure come questo:

./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc 

Così iniziamo con le foglie del tuo grafo delle dipendenze e il tuo lavoro su. Si consiglia inoltre di passare --enable-static --disable-shared a configure: ciò interromperà la creazione di librerie dinamiche per pacchetti libtooled. Potrebbe essere necessario installare alcuni pacchetti in modo nativo e compilarli a croce, se un pacchetto ha bisogno di eseguire un programma come parte del build.

A volte i test di configure non riescono: dove tenta di compilare ed eseguire un programma, ad esempio. Spesso questi test impostano una variabile cache che è anche possibile passare alla riga di comando su configure. Allo stesso modo, è possibile ignorare le cose come i percorsi del programma e le bandiere di compilazione/collegamento delle librerie. Controlla il pacchetto ./configure --help.

0

Quello che devi fare è creare librerie statiche per tutte le dipendenze e collegarle staticamente al tuo eseguibile. Avrai bisogno di usare il cross-compiler per produrre queste librerie. Puoi trovare alcuni buoni esempi cercando "mingw static link cross compile"

3

Non c'è alcun problema nella costruzione di librerie condivise cross-compilate a patto che tu stia costruendo contro intestazioni e librerie per il sistema di destinazione piuttosto che l'host di sviluppo.

Anche se hai costruito tutte le dipendenze ovvie come librerie statiche, probabilmente ti troverai ancora a collegarti alle librerie di runtime in linguaggio C e C++ condivise. Inoltre, si desidera essere certi che i file di intestazione utilizzati per la compilazione incrociata siano quelli del sistema di destinazione piuttosto che l'host di sviluppo.
Non farlo probabilmente funzionerà la maggior parte del tempo. Il resto del tempo si verificheranno arresti anomali e difficili da debug.

Il modo in cui si ottiene ciò dipende dal modo in cui si attraversa la catena degli strumenti e l'ambiente di destinazione. Come non hai menzionato nessuno dei due, immagino che sia GCC e alcuni aspetti di Linux come host e target di sviluppo, sebbene i principi si applichino ugualmente all'utilizzo di altri host di sviluppo.

Le distribuzioni di compilazione incrociata GCC e bin-utils sono in genere create in modo che la libreria e i percorsi di ricerca dell'intestazione predefiniti puntino a una copia del sistema di archiviazione radice del sistema di destinazione. È qui che il linker cercherà le librerie condivise a cui collegarsi, ed è qui che installate le vostre librerie condivise dipendenti quando vengono create.

È possibile eseguire l'override della root di sistema predefinita di GCC passando l'opzione --sysroot <mySysRoot> a GCC sulla riga di comando.