2010-05-17 20 views
6

Mam projekt C++ natywny dla VS2008, który chcę skompilować jako bibliotekę DLL.Projekt C++ kompiluje się jako statyczna lib, kończy się niepowodzeniem (błąd łącznika) jako dynamiczna biblioteka. czemu?

Odnosi się tylko do jednej biblioteki zewnętrznej (log4cplus.lib) i wykorzystuje jej funkcje. (również używa plików .h4 log4cplus, oczywiście).

Kiedy próbuję skompilować mój projekt jako bibliotekę statyczną, to sukces. Kiedy próbuję jako DLL, to nie:

1>MessageWriter.obj : error LNK2019: unresolved external symbol "public: static class log4cplus::Logger __cdecl log4cplus::Logger::getInstance(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" ([email protected]@[email protected]@[email protected][email protected][email protected][email protected]@@[email protected][email protected]@@[email protected]@@Z) referenced in function "class log4cplus::Logger __cdecl Log(void)" ([email protected]@[email protected]@@XZ) 

Istnieją 4 więcej błędów tak jak ten związany z funkcji w log4cplus.lib.

Wydaje się, że coś naprawdę głupiego .. proszę mi pomóc :)

Dzięki!

Edit:

jestem powiązany z plikiem log4cplus.lib, i stwierdzi, że dobrze. również, log4cplus.lib jest w 100% funkcjonalny, używam go w innym projekcie bez żadnych problemów. Mój oryginalny intencją było skompilować mój projekt jako statyczne biblioteki i używać go w innym DLL piszę, ale kiedy to zrobić, mam te same błędy linkera w tym drugim projekcie ...

Edit # 2:

Funkcje, które powodują błędy linkera, są funkcjami statycznymi. Czy może to być częścią problemu?

Odpowiedz

1

Czy faktycznie łączysz się z plikiem log2cplus.lib? Jeśli kompilowałeś się jako biblioteka statyczna, to łączyłbyś się z nią poprzez ostateczny .exe, a nie w bibliotece statycznej - może to jest różnica?

+0

Tak, jestem powiązanie z plikiem log4cplus.lib ... – Roey

+0

OK cool - i to w ścieżce biblioteki? – trojanfoe

+0

tak, znajdzie plik na pewno (gdy zmienię nazwę biblioteki na coś, co nieprawdziwa kompilacja zawodzi od razu) ... Nie rozumiem, dlaczego nie znaleźć te funkcje wewnątrz log4cplus.lib ... :( – Roey

4

Podczas tworzenia biblioteki statycznej twórca biblioteki nie próbuje rozwiązać wszystkich używanych funkcji (tych, które są w log2cplus.lib). Te funkcje są rozwiązywane podczas tworzenia pliku wykonywalnego, który łączy się z biblioteką statyczną.

Podczas tworzenia biblioteki dynamicznej twórca biblioteki (łącznik) próbuje rozwiązać wszystkie używane funkcje. Musisz dostarczyć linker do biblioteki log4cplus.lib zaraz po zbudowaniu biblioteki dynamicznej. Nie możesz czekać, aż utworzysz plik wykonywalny.

+0

Mam go z log4cplus.lib .... Dodałem go do części "linker" właściwości projektu ... – Roey

+0

Znajduje plik na pewno ... jak już stwierdzono poniżej ... po prostu nie rozpoznaje niektórych funkcji z jakiegoś powodu ... – Roey

0

Użyłeś __declspec (dllimport) i __declspec (dllexport)?

Nie są one konieczne podczas łączenia bibliotek statycznych, ale są wymagane w przypadku bibliotek DLL. Funkcję należy zadeklarować do eksportu (w bibliotece DLL), aby użytkownicy mogli jej używać na zewnątrz (a tym samym zaimportować ją z biblioteki DLL).

Może to pomoże:

importowanie do aplikacji za pomocą __declspec (dllimport)

http://msdn.microsoft.com/en-us/library/8fskxacy%28VS.80%29.aspx

pozdrawiam

0

Jeśli używasz kompilatora jak MSVC, to może zmienili ustawienia projektu bez wiedzy o tym przy zmianie z lib na dll. Powinieneś dwukrotnie sprawdzić, czy w trybie DLL jesteś poprawnie połączony z biblioteką.

2

W obu przypadkach konieczne jest połączenie z biblioteką.

Różnica polega na tym, że po połączeniu statycznym - cała funkcjonalność jest połączona z biblioteką, której używasz.

Kiedy łączysz się dynamicznie, łączysz się z biblioteką importu, które mają funkcjonalność do załadowania i używania funkcji z biblioteki dll i tego kroku, którego brakuje. Zwykle biblioteka importu ma taką samą nazwę jak biblioteka dll, z którą łączysz.

Edit:

Widziałem to, że brakuje symbolu nie jest „__imp ...” Oznacza to, że plik nagłówka nie jest „skonfigurowany” do dynamicznego powiązania, prawdopodobnie dlatego, że masz LOG4CPLUS_BUILD_DLL lub log4cplus_EXPORTS lub DLL_EXPORT niezdefiniowane w projekcie, w którym zawarte są nagłówki Log4Cplus.

+0

Gdzie powinienem umieścić DLL? – Roey

+0

Czy plik DLL nie powinien być ładowany tylko w środowisku wykonawczym? dlaczego linker próbował go znaleźć? – Roey

+0

Dobrze, ale potrzebujesz trochę informacji, co dll i jak uzyskać do niego dostęp, ponieważ są tam biblioteki importu. Myślę, że wiem, co jest nie tak - zobacz moją aktualizację. – XAder

0

Istnieją dwie możliwości, które widzę za błąd linkera:

  1. po wykompilowaniu log4cplus.dll (i związany log4cplus.lib import biblioteki) za pomocą dostarczonego konfiguracji kompilacji Release ale teraz twoi aplikacja jest skompilowana z opcją "Zestaw znaków" ustawioną na "Użyj zestawu znaków Unicode"

  2. Lub próbujesz użyć biblioteki statycznej log4cplus, ale definiujesz LOG4CPLUS_BUILD_DLL dla swojej aplikacji.

Założę się na numer 1. To może być coś innego, nadal. Jakiej wersji log4cplus używasz?

Jeśli chcesz użyć pliku log4cplus.dll w swojej aplikacji, zdefiniuj symbol LOG4CPLUS_BUILD_DLL. log4cplus_EXPORTS i DLL_EXPORT są dostępne tylko w celu obsługi systemu kompilacji opartego na CMake i systemu kompilacji opartego na autotoolach na MingGW.

6

Wilx ma rację. Mam ten sam problem z linkiem.

zajęło mi to prawie jeden dzień, aby rozwiązać ten problem.

Pobrałem log4cplus-1.0.4, po tym, jak otworzyłem ten projekt ze studiem visual 2010, skompilowałem go, zarówno bibliotekę statyczną, jak i dynamiczną, bez błędów.

Jednak gdy próbuję korzystać z tej biblioteki, otrzymałem błąd łącza, bez względu na bibliotekę statyczną lub bibliotekę dynamiczną.

Powodem jest domyślnie, że te projekty używają znaków wielobajtowych, jednak mój własny projekt wykorzystuje kod Unicode, więc aby rozwiązać ten problem, wystarczy zmienić zestaw znaków jednego projektu.

zarówno kodowanie w formacie Unicode, jak i oba w postaci wielobajtowej.

i zmienić zestaw znaków jednego projektu w Visual Studio 2010, zobacz poniższy link.

How do I turn off Unicode in a VC++ project?

Powiązane problemy