Plik lib zbudowany w VS 2008/VS 2012

0

Witam,

Mam projekt w którym muszę wykorzystać bibliotekę ActiveMQ. Solucja najnowszej wersji tej biblioteki stworzona została w Visual Studio 2010. Na komputerze mam jedynie narzędzia: Visual Studio 2008 oraz Visual Studio 2012. W pierwszej kolejności otworzyłem projekt w Visual Studio 2008 uruchamia się kreator do konwersji pliku SLN, ale kończy się on niepowodzeniem i w efekcie solucji nie da się otworzyć. Więc ta opcja raczej odpada. Następnie spróbowałem otworzyć go w Visual Studio 2012. Otworzył się poprawnie. Gdy chciałem zbudować plik lib pojawiła się informacja o konieczności aktualizacji solucji do wersji VS 2012. Kliknąłem "Update Solution" i biblioteka zbudowała się bez żadnych błędów. Dla testu stworzyłem dwa projekty: pierwszy w Visual Studio 2008 i drugi w Visual Studio 2012. Do obydwu podpiąłem bibliotekę ActiveMQ (tzn. wskazałem lokalizację pliku lib, folderów z headerami, oraz nazwę utworzonego wcześniej pliku lib). W pierwszym przypadku mam kilka tysięcy błędów typu "unresolved external symbol" tj. ten lib nie był rozpoznawany (?). W drugim przypadku, wszystko się buduję i jestem wstanie napisać i przetestować kawałek kodu wykorzystującego funkcjonalności tej biblioteki. Niestety projekt do którego muszę podpiąć bibliotekę ActiveMQ jest stworzony w Visual Studio 2008 i tam ona również nie działa.

Czy ktoś z Was spotkał się z podobnym błędem? Jak go rozwiązać? Może to kwestia ustawień projektu w Visual Studio 2012?

0

Po pierwsze, to post jest napisany chaotycznie: co chwilę „zmieniasz wersję” z 2012 na 2008 i z powrotem i nie wiadomo w końcu o co ci chodzi.

Rozumiem że biblioteka skompilowana pod 2012 działa pod 2012, więc to nie problem.

A chcesz by działała pod 2008, a solucja jest w wersji dla 2010.

To czy to się w ogóle uda zależeć będzie od wielu czynników, i od szczęścia.

Czy biblioteka udostępnia tylko funkcje globalne (jest biblioteką napisaną w C albo C++ ale „w stylu C”), czy jest biblioteką typowo C++ z klasami?

W pierwszym przypadku mam kilka tysięcy błędów typu "unresolved external symbol"

Wklej tu trochę tych błędów.

wszystko się buduję
buduje

0

Ok, przepraszam jeśli pierwszy post był nieco zagmatwany.
Tak- ogólnie jest tak, że jeśli wszystko buduje i linkuje pod VS 2012 to biblioteka "działa". Natomiast jeśli tę samą bibliotekę (zbudowaną wcześniej w VS 2012) podpinam do projektu w VS 2008 to mam masę błędów.

W załączniku dołączam log z kompilacji.

Przykładowo są to takie błędy:

2>libactivemq-cpp.lib(CompositeData.obj) : error LNK2001: unresolved external symbol "public: virtual void __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ)
2>libactivemq-cpp.lib(CMSExceptionCMS.obj) : error LNK2001: unresolved external symbol "public: virtual void __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ)
2>libactivemq-cpp.lib(Float.obj) : error LNK2001: unresolved external symbol "public: virtual void __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ)
2>libactivemq-cpp.lib(Exception.obj) : error LNK2001: unresolved external symbol "public: virtual void __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ)
2>libactivemq-cpp.lib(ServerSocket.obj) : error LNK2001: unresolved external symbol "public: virtual void __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ)
2>libactivemq-cpp.lib(Properties.obj) : error LNK2001: unresolved external symbol "public: virtual void __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ)
2>libactivemq-cpp.lib(WireFormatInfo.obj) : error LNK2001: unresolved external symbol "public: virtual void __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ)
2>libactivemq-cpp.lib(InetAddress.obj) : error LNK2019: unresolved external symbol apr_sockaddr_info_get referenced in function "public: static class decaf::net::InetAddress __cdecl decaf::net::InetAddress::getLocalHost(void)" (?getLocalHost@InetAddress@net@decaf@@SA?AV123@XZ)
0

Mieszasz CRT.

0

To znaczy?
Czy chodzi o te ustawienia:
https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
?

0

W bardzo dużym skrócie STL nie jest kompatybilny między różnymi wersjami kompilatora/linkera.

0

Da sie to jakos "naprawic"? Np. zmieniajac jakies ustawienia builda? Wydaje mi się mało prawdopodobne, że przez wersję Visual Studio biblioteka od tak staje się nie zdatna do użytku.

1

Nie da się tego "naprawić" w trywialny sposób. Wszystko zależy od tego jakie api wystawia ta biblioteka. Bez wglądu w kod ciężko będzie coś konkretnego poradzić poza ogólnymi kwestiami. Biblioteki statycznej nie możesz zbudować w taki sposób żeby była niezależna od wersji kompilatora, natomiast (niektóre) biblioteki dynamiczne można tak budować. Więc moja rada zbuduj tę bibliotekę, jako dynamiczną i sprawdź czy zadziała. Nawet jeśli ten sposób z biblioteką dynamicznie linkowaną/modułem zadziała to będziesz musiał zwrócić uwagę na to czy poprawnie zarządzasz pamięcią na granicy biblioteka - inny moduł.

Poza tym gorąco polecam ci zapoznać się z tym jak działa linker, co to jest linkowanie statyczne, dynamiczne, co to CRT, COM, ABI... Jeśli chcesz to mogę ci podesłać jakieś materiały na ten temat.

0

Nie odpowiedziałeś na bardzo istotne pytanie

Czy biblioteka udostępnia tylko funkcje globalne (jest biblioteką napisaną w C albo C++ ale „w stylu C”), czy jest biblioteką typowo C++ z klasami?

0

Jasne, jeśli masz jakieś ciekawe materiały na ten temat i mógłbyś się podzielić to bardzo chętnie je przeczytam. Dzięki!

Spróbuje jeszcze zbudować plik DLL. Dam znać jutro czy to coś pomogło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1