2013-02-26 21 views
7

Mam plik foo.h, który ma różne deklaracje funkcji. Wszystkie te funkcje są zaimplementowane w pliku foo.dll. Jednak, kiedy to plik .h i spróbuj użyć dowolnej funkcji, pojawia się błąd:Jak połączyć bibliotekę DLL z moim projektem? błąd LNK2019: nierozwiązany zewnętrzny symbol

bar.obj : error LNK2019: unresolved external symbol SomeFunction 

więc oczywiście nie znajdowane są implementacje funkcji.

Co muszę zrobić, aby pomóc kompilatorowi znaleźć definicje w bibliotece DLL i powiązać je z plikiem .h?

Widziałem pewne rzeczy o __declspec(dllexport) i __declspec(dllimport), ale nadal nie mogę dowiedzieć się, jak z nich korzystać.

+0

Czy łączysz plik wykonywalny z biblioteką importu 'foo.dll' (zwykle o nazwie' foo.lib')? –

+0

Jestem nowy w tym, więc nie jestem naprawdę pewien, jak to się robi. Czy to jest w projekcie studia wizualnego? – xcdemon05

+1

@ xcdemon05, tak, wśród opcji linkera. –

Odpowiedz

8

Powinieneś mieć co najmniej trzypliki właściciela DLL. DLL, który będziesz potrzebować w czasie wykonywania, plik .h z deklaracjami wyeksportowanych funkcji, już to masz. I plik .lib, biblioteka importu dla biblioteki DLL. Które linker wymaga, aby wiedział, jak dodać funkcje do tabeli importu programu.

Brakuje kroku, w którym powiedziałeś linkerowi, że musi on połączyć plik .lib. Należy go dodać do ustawienia Input + Additional Dependencies dla linkera w projekcie. Lub najłatwiej zrobić pisząc dyspozycję łącznikowej w kodzie źródłowym:

#include "foo.h" 
#pragma comment(lib, "foo.lib") 

Który działa na MSVC, nie inaczej przenośny, ale nigdy nie jest łączenie. Skopiuj plik .lib do katalogu projektu lub podaj pełną ścieżkę.

+0

Czy istnieje różnica między korzystaniem z '#pragma comment' i dodawania pliku lib do' Właściwości projektu> Linker> Wejście'? – Nitay

+1

Nie ma różnicy, po prostu nie można zapomnieć zmienić tego ustawienia. –

3
  1. musisz określić przed definicjami funkcji __declspec (dllexport) słowa kluczowego w czasie budowy dll
  2. należy zaimportować lub załadować plik .dll do pamięci procesu.
  3. Musisz uzyskać adres funkcji, której chcesz użyć z tej biblioteki DLL.

Przydatne linki zacząć :: MSDN Documentation, SO, Random

6

Po prostu miałem podobny problem. Rozwiązaniem okazało się, że DLL był 64-bitowy, a prosta aplikacja używała go 32. Zapomniałem zmienić go na x64 w Menedżerze konfiguracji.

+2

Właśnie uratowałeś mój dzień po trzech godzinach przeszukiwania Internetu. – Dan

Powiązane problemy