[VC++] problem z linkowaniem biblioteki .a

0

Witam

W Code::Blocks(mingw) napisałem swoją bibliotekę, kiedy dołączam ją do innego projektu w C::B wszystko działa.

Problem pojawia się kiedy chcę ją dołączyć do projektu VC++. Plik .a skopiowałem do VC/lib, pliki .h do VC/include. W Linker/Include/Additional Dependencies dopisałem plik .a.

Podczas linkowania dostaję błędy:

Error	1	error LNK2019: unresolved external symbol "public: virtual __thiscall lnm::NCSettings::~NCSettings(void)" (??1NCSettings@lnm@@UAE@XZ) referenced in function _wmain	test.obj	test
Error	2	error LNK2019: unresolved external symbol "public: __thiscall lnm::NCSettings::NCSettings(void)" (??0NCSettings@lnm@@QAE@XZ) referenced in function _wmain	test.obj	test
Error	3	fatal error LNK1120: 2 unresolved externals	C:\Users\sharkos\Documents\Visual Studio 2008\Projects\test\Debug\test.exe	test

Czy moja biblioteka musi być skompilowana za pomocą VS aby z nim działała?

Edit:
Skompilowałem swoją bibliotekę za pomocą kompilatora MS VC++ (za pomocą C::B), mam swoja bibliotekę .lib dołączyłem ją do nowego projektu w VS i dostaję takie błędy:

Error	1	error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in libnetmod.lib(NCSettings.obj)	msvcprtd.lib	test
Error	2	error LNK2005: "public: static unsigned int __cdecl std::char_traits<char>::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in libnetmod.lib(NCSettings.obj)	msvcprtd.lib	test
Warning	3	warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library	test	test
Error	4	fatal error LNK1169: one or more multiply defined symbols found	C:\Users\sharkos\Documents\Visual Studio 2008\Projects\test\Debug\test.exe	test

Kompilacja programu korzystającego z mojej biblioteki za pomocą C::B z kompilatorem MS VC++ daje taki rezultat:

msvcprt.lib(MSVCP90.dll)||error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct d::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) already defined in main.obj|
msvcprt.lib(MSVCP90.dll)||error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?
//CIACH - q
0

tak, Twoja biblioteka .a musi byc skompilowana przez msvc, czyli musi byc defacto plikiem .lib
mingw i msvc sa niestety kompletnie innymi kompilatorami i abstrahujac od .cpp/.hpp nie rozumieja swoich plikow nazwajem

komunikaty ktore dostajesz w momencie gdy kompilujesz ja pod msvc mowia, ze w kilku (dwoch?) miescjach rozne moduly probuja wyeksportowan/upublicznic ten sam symbol. biorac pod uwage, ze jest to basic_string::cos oraz char_traits::costam, najprawdopodobniej zle ustawiles opcje projektu ktorym kompilowales tego .lib'a -- zostalo do niego wciagniete cos z libstd ktore potem koliduje z libstd ktorego wlasciwa aplikacja uzywa. moze niepotrzebnie nakazales wkompilowac libstd w tego lib'a? moze lib'a skompilowales z INNYM libstd niz wlasciwa aplikacje? innym = inne debug/release, inne multi/singlethreaded, inne #define konfiguracyjne, inne (....)

przede wszystkim, sprawdz czy opcje obu projektow sie zgadzaja. przelec po sekcji 4 i 5 http://support.microsoft.com/kb/94248, zastanow sie/wyprobuj czy /nodefaultlib w ktoryms projekcie Ci pomoze. musisz przede wszystkim dowiedziec sie, dokladnie, skad ta kolizja wynika (z jakich wielokrotnych .lib skladowych, z jakich opcji projektu)

0

Problem rozwiązany.
Cały projekt dodałem do MSVS i tam skompilowałem. Biblioteka działa.
Najwidoczniej w C::B było coś źle ustawione w opcjach kompilatora VC++ albo jakichś ustawień brakowało.

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