2010-04-26 13 views
5

Voglio costruire il mio programma con il compilatore C++ LSB dalla base standard Linux http://www.linuxfoundation.org/collaborate/workgroups/lsb. Il programma dipende dalla libreria Boost, costruita con la versione gcc 4.4. La compilazione fallisce. È possibile costruire la libreria Boost con il compilatore C++ LSB? In alternativa, è possibile creare la libreria Boost con qualche vecchia versione gcc, quale versione è raccomandata? Il mio obiettivo finale è quello di far funzionare le mie librerie Boost eseguibili e di terze parti sulla maggior parte delle distribuzioni Linux.Building Boost con compilatore C++ LSB

Generalmente, cosa si può fare per ottenere una migliore compatibilità binaria per le distribuzioni Linux, sviluppando un'applicazione C++ closed-source in base alla libreria Boost?

+0

Da quando LSB è un compilatore? Ho pensato che fosse solo una specifica di quali librerie e utilità dovessero essere installate e disponibili su una distribuzione Linux (in modo che altre librerie e utility possano dipendere dal fatto che siano lì). –

+0

Michael Aaron Safyan: il progetto LSB fornisce il proprio compilatore C++ che può essere usato al posto di GCC e dovrebbe produrre binari compatibili con tutte le distribuzioni Linux. In effetti, l'uso di questo compilatore per il mio codice dà buoni risultati. Tuttavia, ho problemi con le librerie di terze parti utilizzate nel mio progetto. –

+0

@ Michael, LSB è un insieme di specifiche, ma il gruppo di lavoro fornisce anche strumenti che aiutano a sviluppare programmi che corrispondono a queste specifiche. Vedi qui http://ldn.linuxfoundation.org/lsb/porting-lsb-demo e qui http://www.linuxfoundation.org/collaborate/workgroups/linux-standard-base-lsb/lsb-sdk-403 –

risposta

3

LSB Il compilatore C++ non è in realtà un compilatore. L'eseguibile lsbc++ è un wrapper attorno al compilatore GCC installato nel sistema (il compilatore effettivo può essere controllato tramite l'opzione --lsb-cxx). Molto probabilmente si introdurrà nel sistema boost build per chiamare il wrapper LSB invece del compilatore nativo gcc.

Quindi i problemi che potrebbero sorgere non sono probabilmente dovuti al fatto che il compilatore LSB non possa compilare i costrutti del linguaggio, ma che ci siano alcuni problemi di collegamento.

Ad esempio, il compilatore LSB per impostazione predefinita scarta tutte le librerie condivise a cui è collegato il codice, a meno che non appartengano a LSB. Questo può portare a errori di collegamento se BOOST si basa su tali librerie. Questo può essere controllato tramite la variabile di ambiente LSBCC_SHAREDLIBS, ma è necessario assicurarsi di spedire queste librerie insieme al prodotto.

Un altro problema è che LSB cade dietro i rilasci del compilatore GCC (e BOOST può strisciare in tutti gli angoli bui dei compilatori). Per quanto ne so, GCC 4.4 non è testato a sufficienza, quindi è meglio provarlo con il compilatore 4.3.

E Google non sembra trovare nulla di relativo al potenziamento dell'edificio con LSBCC, quindi se riesci a farlo, per favore, condividi la tua esperienza, ad esempio, come la tua risposta alla tua domanda.

+0

Ho provato a creare il Boost che sostituisce il file g ++ con collegamento a lsbC++. Il risultato fu che la compilazione di molte librerie fallì. Proverò la versione GCC 4.3, grazie per questa informazione. –

+0

@Alex, spero che insieme al link di sostituzione hai anche indicato 'lsbC++' al compilatore reale, quindi non ha reclamato :-D. Ad ogni modo, puoi anche cercare di ottenere aiuto nella mailing list LSB: https://lists.linux-foundation.org/mailman/listinfo/lsb-discuss Il formato della mailing list è più adatto per discutere di errori concreti con i log degli errori rispetto a StackOverflow . –

+0

L'utilizzo di GCC 4.3 non ha aiutato, non riesco ancora a utilizzare il compilatore lsbC++ per le librerie di terze parti. Tuttavia, ho alcuni risultati con LSB Application Checker. Aggiungendo librerie mancanti al mio pacchetto, sono riuscito a ottenere 49 delle 50 compatibilità delle distribuzioni Linux per il programma usando la libreria ASIO Boost. Tipo di successo ... Grazie per il tuo aiuto. –

6

Recentemente ho dovuto chiamare per fare questo, nel caso in cui è utile a chiunque altro questi sono i passi che ho seguito:

  • scaricare e installare il LSB SDK
  • Scaricare una versione di incrementare ed estrarre in/opt/boost/boost_ <versione> (Ho usato 1,43)
  • Assicurarsi che sia installato libbz2-dev.
  • Bootstrap con
cd /opt/boost/boost_<version> 
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu 
  • Modifica /opt/boost/boost_<version>/project-config.jam e aggiungere la riga
using gcc : : /opt/lsb/bin/lsbc++ : <cflags>-U_GNU_SOURCE <cxxflags>-U_GNU_SOURCE ; 

vicino alla parte superiore del file. Nota che questo fallirà se hai una dichiarazione usando in uno degli altri file di cui bjam legge la sua configurazione, puoi passare --debug-configuration per avere un'idea di quali file sta leggendo.

  • Run
./bjam cflags=-fPIC cxxflags=-fPIC linkflags=-fPIC install 

Io non ho cercato di ottenere sia il pitone o librerie MPI di lavoro, né cerco di terapia intensiva di lavoro con la libreria boost.regex. Quest'ultimo è probabilmente un caso di costruzione di versioni statiche delle librerie ICU con il set di strumenti LSB.

Il -fPIC non è strettamente necessario per Linux a 32 bit, ma è necessario se si desidera collegare librerie statiche in una libreria condivisa per Linux a 64 bit.

Il risultato finale deve essere binari in /opt/boost/lib e intestazioni in /opt/boost/include, ovviamente è possibile modificare il prefisso in base alle proprie preferenze. Ho ancora un bel po 'di lavoro da fare prima di aver trasferito tutto il nostro codice all'LSB, quindi non posso riferire quanto bene il processo di certificazione è ancora in corso.

+0

Interessante, grazie. Attualmente sto usando strumenti automatici per risolvere problemi di compatibilità binaria. Terrò la tua risposta per riferimento futuro. –