2009-11-20 14 views
11

Sto provando a creare un'applicazione che dipende da Boost. Così ho scaricato Boost 1_41_0 nel mio box Linux e ho seguito le istruzioni trovate sul sito Boost per le varianti Unix, http://www.boost.org/doc/libs/1_41_0/more/getting_started/unix-variants.html.Edificio Boost su Linux - nomi libreria

Fondamentalmente suggeriscono di eseguire ./bjam install, cosa che ho fatto. La compilazione è stata completata con successo. Tuttavia, i nomi delle librerie non sembrano corrispondere alla convenzione di denominazione Boost descritta sia nella documentazione di cui sopra, sia in ciò che è specificato nel makefile dell'applicazione che sto cercando di creare.

Ho notato che ci sono un sacco di opzioni che posso specificare su bjam e ho provato a giocare con quelle, ma non importa quello che succede, non riesco a farlo correttamente. La mia comprensione è che le librerie dovrebbero andare nella directory $ BOOST_ROOT/lib. Questo è dove le librerie appaiono, ma prende il nome:

libboost_thread.a 
libboost_thread.so 
libboost_thread.so.1.41.0 

mi aspetto che per essere nominato libboost_thread-gcc41-mt-d-1_41_0 o qualcosa di simile.

ho provato ./bjam --build-type = completa --layout = etichettato e vedo:

libboost_thread.a 
libboost_thread-mt.a 
libboost_thread-mt-d.a 
libboost_thread-mt-d.so 
libboost_thread-mt-d.so.1.41.0 
libboost_thread-mt-s.a 
libboost_thread-mt-sd.a 
libboost_thread-mt.so 
libboost_thread-mt.so.1.41.0 
libboost_thread.so 
libboost_thread.so.1.41.0 

Quindi, io non sono sicuro se devo solo fare scena mia directory -L? C'è qualche documentazione che descrive questo in modo più dettagliato?

risposta

7

I nomi sono stati cambiati in 1.40.0 - vedono in release notes:

Build System

La denominazione di default delle librerie in ambiente Unix-like ora corrisponde convenzioni del sistema, e non lo fa includere varie decorazioni.

Probabilmente hanno dimenticato di aggiornare questa parte nella documentazione di compilazione.

2

Qui ci sono due variabili. Il primo è "install" rispetto a "stage" (predefinito). "install" copia entrambe le librerie e le intestazioni in una directory -/usr/local per impostazione predefinita, e quindi è possibile rimuovere la struttura dei sorgenti. "stage" mette le librerie in "stage/lib", e dovresti aggiungere i flag "-L/stage/lib -I".

Il secondo è --layout = versione e --layout = sistema. Sembra che tu abbia già scoperto quello che fanno già, e infatti, il sistema è predefinito dal 1.40. La guida introduttiva non menziona questo e ho aggiunto un elemento di azione per aggiornarlo. Idealmente, dovresti parlare con gli autori dell'applicazione per usare la denominazione di sistema delle librerie di boost. Se ciò non è possibile, la costruzione con --layout = versioned è l'unica opzione.

1

Dalla documentazione Boost al http://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html#library-naming, la convenzione è:

-MT tag Threading: indica che la biblioteca è stata costruita con il supporto multithreading abilitato. Le librerie create senza supporto multithreading possono essere identificate dall'assenza di -mt.

-d Tag ABI: codifica i dettagli che influiscono sull'interoperabilità della libreria con altri codici compilati.Per ciascuna di queste caratteristiche, una sola lettera si aggiunge al tag:

 
Key  Use this library when: 
s linking statically to the C++ standard library and compiler runtime support libraries. 
g using debug versions of the standard and runtime support libraries. 
y using a special debug build of Python. 
d building a debug version of your code. 
p using the STLPort standard library rather than the default one supplied with your compiler. 
n using STLPort's deprecated “native iostreams” feature. 

Ad esempio, se si crea una versione di debug del codice per l'utilizzo con le versioni di debug della libreria runtime statica e la libreria standard STLPort in “ modalità "iostreams nativi", il tag sarebbe: -sgdpn. Se nessuno dei precedenti si applica, il tag ABI è omesso.

+1

Come si costruisce un Boost con supporto multithreading? Boost's [Installazione] (http://www.boost.org/doc/libs/1_54_0/doc/html/bbv2/installation.html) non ne parla. – jww

+2

Al momento del potenziamento dell'edificio, utilizzare: ./b2 --build-type = complete --layout = versione Questo genererà ciascuna versione di ciascuna libreria, compresi quelli con multithreading. – Riot

+1

Grazie Riot. Da [altre discussioni] (http://stackoverflow.com/questions/2293962/boost-libraries-in-multithreading-aware-mode) su Stack Overflow, sembra che Boost sia multi-thread per impostazione predefinita. Quindi se eseguo './B2', ottengo multi-thread senza decorazioni. Non è questo il caso? – jww