2013-04-17 12 views
7

Używam boost w moim projekcie. Pobrałem skompilowane pliki binarne stąd http://boost.teeks99.com/błąd łączenia: niejednoznaczne libboost * .lib kontra boost * .lib

Podczas łączenia otrzymuję taki błąd:

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

Dlaczego Boost zawiera dwa lib z tak podobnej nazwie, jaka jest różnica między nimi?

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

Jak naprawić łączące błąd?

upd Sam skompilowałem doładowanie. Dodałem katalog boost_1_53_0\stage\lib do linkera. Ten katalog faktycznie zawiera 3 "kopie" w "każdym" pliku, na przykład:

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

Więc jest jasne, o co twierdzi kompilator. Jakoś nie może zrozumieć, której wersji pliku lib użyć. Jest to prawdopodobnie związane z łączeniem statycznym/dynamicznym, ale nadal nie mogę znaleźć rozwiązania. Jestem pewien, że moje problemy są dość powszechne, więc mam nadzieję, że ktoś może zasugerować mi, co mam robić.

Próbowałem usunąć wszystkie „libboost *” pliki z folderu, ale potem otrzymać taki błąd: Error 15 error LNK1104: cannot open file 'libboost_date_time-vc110-mt-1_53.lib'

Starałem się usunąć wszystkie „boost * lib” pliki z folderu, ale potem odbierać taki błąd: Error 15 error LNK1104: cannot open file 'boost_thread-vc110-mt-1_53.lib'

Potem kopiowane boost_thread-vc110-mt-1_53.lib z powrotem i dostaję mnóstwo błędów tak:

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)

Tak więc, gdy nie ma kompilatora boost_thread-vc110-mt-1_53.lib, który twierdzi, że go brakuje, kompilator twierdzi, że "funkcja jest już zdefiniowana". Czy w jakiś sposób używam dinamicznego i statycznego linkowania w tym samym czasie lub czegoś w tym stylu?

upd2 Odrzuciłem komentarz #define BOOST_ALL_DYN_LINK zgodnie z sugestią here i teraz kompiluje kod! badam, czy wszystko inne jest w porządku. jednak nie rozumiem, dlaczego powinienem odkomentować #define BOOST_ALL_DYN_LINK, więc komentarze są mile widziane.

+1

Podjęto próbę połączenia zarówno statycznej, jak i dynamicznej wersji Boost.Thread. 'boost_thread' jest biblioteką importu dla biblioteki dll,' libboost_thread' jest biblioteką statyczną. –

+0

dlaczego VS łącząc oba, jak rozwiązać ten problem? – javapowered

+1

Zazwyczaj VS tego nie robi, więc pytanie brzmi, co jest nie tak z twoimi ustawieniami. Czy masz zdefiniowany "BOOST_ALL_DYN_LINK"? Czy łączysz się z CRT statycznie lub dynamicznie (/ MT lub/MD)? Czy wymuszasz linkowanie niektórych z powyższych bibliotek (Linker -> Input -> Aditional dependencies lub '# pragma comment (lib, ...)')? –

Odpowiedz

0

samemu pytam myquestion. potrzeba Odkomentuj #define BOOST_ALL_DYN_LINK (patrz opis)

5

Edytuj: Usunięto instrukcję początkową, ponieważ zmiana w poście zmieniła sytuację.

podstawie http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#library-naming (zgodnie Igora R.):

libboost_thread-vc110-mt-1_52.lib jest statyczny lib (nie ma potrzeby DLL) boost_thread-vc110-mt-1_52.lib jest biblioteką importującą do biblioteki DLL

Należy użyć tylko jednej z nich.

+0

nie, obie "lib", oczywiście mam też dll też – javapowered

+0

Przed edycją jeden był wymieniony jako biblioteka dll. Opublikuj rozmiary dwóch; jeśli jeden jest znacznie mniejszy niż inny, to duży prawdopodobnie jest statyczną biblioteką, usuwając potrzebę biblioteki dll. Jeśli są bliżej, jedna może być wersją debugowania, a druga jest wersją. – mah

+1

@mah zapoznaj się z konwencjami nazewnictwa boost: http://www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#library-naming –

0

Myślę, że przede wszystkim trzeba poprawić swoje pytanie. Czy masz na myśli (Chyba już znać różnicę między DLL i LIB)

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

lub

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

W każdym razie wydaje się, że problem został jesteś mieszanie statyczne (libboost_thread-vc110-mt-1_52.lib) i dzielone (boost_thread-vc110-mt-1_52.lib) bibliotek boost. Jednak bez środowiska pracy i szczegółów platformy nie mogę dokładnie określić rozwiązania. Jeśli pracujesz w Visual Studio, możesz przejść do right click on project file>properties>linker>input>ignore specific library i dodać tam libboost_thread-vc110-mt-1_52.lib i spróbować.

+0

dziękuję, próbuję zbudować od podstaw pobudkę, prawdopodobnie moja wersja z jakiegoś powodu zostanie zerwana ... – javapowered

0

inny pomysł/rozwiązanie, aby spróbować, jeśli trafisz błąd error LNK1104: cannot open file 'libboost_date_time-*.lib':

w naszym projekcie, możemy dołączyć plik boost/date_time.hpp. Definiujemy stałą BOOST_ALL_NO_LIB zamiast BOOST_ALL_DYN_LINK w naszych ustawieniach projektu, aby powiedzieć, że funkcja boost nie automatycznie wybiera biblioteki, z którymi ma się linkować. Aby uzyskać więcej informacji na temat tej opcji, zobacz temat Wzmocnienie documentation.

Możesz dodać BOOST_ALL_NO_LIB w Właściwości projektu -> C/C++ -> Preprocessor -> Definicje preprocesora i sprawdzić, czy ten błąd linkera zniknął.