Plik lib zbudowany w VS 2008/VS 2012

Plik lib zbudowany w VS 2008/VS 2012
PA
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:35
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?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 9 godzin
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

edytowany 1x, ostatnio: Azarien
PA
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:35
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:

Kopiuj
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)
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
0

Mieszasz CRT.

PA
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:35
0

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

satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
0

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

PA
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:35
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.

edytowany 2x, ostatnio: PAV
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
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.

edytowany 1x, ostatnio: satirev
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 9 godzin
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?

PA
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 9 lat
  • Postów:35
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.