2013-04-17 30 views
7

Sto usando boost nel mio progetto. Ho scaricato binari pre-compilati da qui http://boost.teeks99.com/errore di collegamento: libboost ambiguo * .lib vs boost * .lib

Quando si collega ricevo tale errore:

Error 18 error LNK2005: "public: void __cdecl boost::thread::join(void)" ([email protected]@[email protected]@QEAAXXZ) already defined in boost_thread-vc110-mt-1_52.lib(boost_thread-vc110-mt-1_52.dll) C:\Oleg\projects\MBClient\FastNativeAdapter\libboost_thread-vc110-mt-1_52.lib(thread.obj) FastNativeAdapter

Perché spinta contiene due lib con nome in modo simile, qual è la differenza tra loro?

  • libboost_thread-vc110-mt-1_52.lib
  • boost_thread-vc110-mt-1_52.lib

Come risolvere l'errore di collegamento?

upd Ho compilato boost. Ho aggiunto la directory boost_1_53_0\stage\lib al linker. Questa directory contiene in realtà 3 "copie" di "ogni" file, ad esempio:

  • boost_atomic-vc110-mt-1_53.dll
  • boost_atomic-vc110-mt-1_53.lib
  • libboost_atomic-vc110 -mt-1_53.lib

Quindi è chiaro ciò che afferma il compilatore. In qualche modo non può capire quale versione del file lib usare. È probabile che sia collegato a collegamenti statici/dinamici, ma non riesco ancora a trovare la soluzione. Sono sicuro che i miei problemi sono piuttosto comuni, quindi spero che qualcuno possa suggerirmi cosa fare.

Ho cercato di eliminare tutte le "libboost *" file dalla cartella, ma poi ho ricevere tale errore: Error 15 error LNK1104: cannot open file 'libboost_date_time-vc110-mt-1_53.lib'

Ho cercato di eliminare tutti i file "spinta * lib" dalla cartella ma poi ricevo tale errore: Error 15 error LNK1104: cannot open file 'boost_thread-vc110-mt-1_53.lib'

Poi ho copiato boost_thread-vc110-mt-1_53.lib indietro e ricevo un sacco di errori del genere:

Error 16 error LNK2005: "public: virtual __cdecl boost::detail::thread_data_base::~thread_data_base(void)" ([email protected]@[email protected]@[email protected]) already defined in boost_thread-vc110-mt-1_53.lib(boost_thread-vc110-mt-1_53.dll)

Quindi, quando non c'è il compilatore boost_thread-vc110-mt-1_53.lib che manca, quando c'è il compilatore boost_thread-vc110-mt-1_53.lib afferma che "la funzione è già definita". Probaly, in qualche modo, io uso il collegamento dinamico e statico allo stesso tempo o qualcosa del genere?

UPD2 ho commentata #define BOOST_ALL_DYN_LINK come suggerito here e ora il codice compila! sto indagando se tutto il resto va bene. tuttavia non ho capito perché dovrei decommentare #define BOOST_ALL_DYN_LINK quindi i commenti sono ben accetti.

+1

Si tenta di collegare entrambe le versioni statiche e dinamiche di Boost.Thread. 'boost_thread' è la libreria di importazione per dll,' libboost_thread' è una libreria statica. –

+0

perché VS collega entrambi, come risolvere questo problema? – javapowered

+1

Di solito VS non lo fa, quindi la domanda è cosa c'è di sbagliato nelle tue impostazioni. Hai definito "BOOST_ALL_DYN_LINK"? Ti colleghi con CRT in modo statico o dinamico (/ MT o/MD)? Forzi il collegamento di alcune delle librerie sopra (Linker -> Input -> dipendenze Aditional o '# pragma comment (lib, ...)')? –

risposta

0

chiedere me stesso a myquestion. necessità di togliere il commento BOOST_ALL_DYN_LINK # define (vedi descrizione)

5

Modifica: dichiarazione iniziale rimossa dal momento che una modifica al post ha cambiato la situazione.

Sulla base http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#library-naming (come previsto da Igor R.):

libboost_thread-vc110-mt-1_52.lib è un lib statica (non è necessario per la DLL) boost_thread-vc110-mt-1_52.lib è la lib di importazione per la DLL

Hai solo bisogno di utilizzare uno di questi.

+0

no, entrambi un 'lib', ovviamente ho anche dll – javapowered

+0

Prima della modifica, uno era elencato come dll. Si prega di inviare le dimensioni dei due; se uno è molto più piccolo dell'altro, allora quello grande è probabilmente una libreria statica, eliminando la necessità della dll. Se sono più vicini, una può essere una versione di debug mentre l'altra è rilasciata. – mah

+1

@mah leggi le convenzioni di denominazione di boost: http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#library-naming –

0

Penso che prima di tutto devi correggere la tua domanda. Vuoi dire (Credo che si conosce già la differenza tra DLL e LIB)

  • libboost_thread-vc110-mt-1_52.lib
  • boost_thread-vc110-mt-1_52. dll

o

  • libboost_thread-vc110-mt-1_52.lib
  • boost_thread-vc110-mt-1_52. lib

In ogni caso, sembra che il problema è che stai mescolando (boost_thread-vc110-mt-1_52.lib) librerie boost statico (libboost_thread-vc110-mt-1_52.lib) e condivise. Ma senza l'ambiente di lavoro e i dettagli della piattaforma non riesco a trovare una soluzione esatta. Se lavori in Visual Studio, allora puoi andare a right click on project file>properties>linker>input>ignore specific library e aggiungere libboost_thread-vc110-mt-1_52.lib lì e provare.

+0

grazie sto provando a sviluppare il boost da zero probabilmente la mia versione si rompe per qualche motivo ... – javapowered

0

Un'altra idea/soluzione da provare se si colpisce l'errore error LNK1104: cannot open file 'libboost_date_time-*.lib':

Nel nostro progetto, includiamo il file boost/date_time.hpp. Definiamo la costante BOOST_ALL_NO_LIB invece di BOOST_ALL_DYN_LINK nelle impostazioni del nostro progetto per dire a Boost non selezionare automaticamente le librerie a cui collegarsi. Vedere il Boost documentation per ulteriori informazioni su questa opzione.

Quindi è possibile aggiungere BOOST_ALL_NO_LIB in Proprietà progetto -> C/C++ -> Preprocessore -> Definizioni di preprocessore e controllare se questo errore del linker scompare.

Problemi correlati