2013-11-26 15 views
11

Mam pytanie o łączenie i plików .lib biblioteki ...Dlaczego niektóre pliki DLL wymagają dodatkowego pliku .lib do połączenia?

to jest kontekst:

  • OS = Okna
  • IDE = QT

Stworzyłem DLL: MyLib.dll.
Aby korzystać z tej biblioteki w moim projekcie QT, tylko muszą zawierać zawierać ścieżkę, link do biblioteki i korzystać z plików nagłówka:

LIBS += "C:\myPath\MyLib.dll" 
INCLUDEPATH += "C:\myPath" 
HEADERS += \ 
    ../myPath/MyLib_global.h \ 
    ../myPath/mylib.h 

używam trzeciej dll partia w moim projekcie: trzeci .dll
Jeśli będę taka sama, jak w powyższym przykładzie, to nie działa:

LIBS += "C:\myPath\third.dll" 

trzecia partia DLL pochodzi z pliku lib „third.lib”, które podobno trzeba używać razem z biblioteką DLL.

Dlaczego tak jest? Dlaczego niektóre biblioteki DLL wymagają pliku .lib, ale inne biblioteki DLL tego nie robią?
Czy to możliwe, że biblioteka .lib jest biblioteką statyczną z dostępem do biblioteki DLL?

Wielkie dzięki!

Odpowiedz

4

Plik lib jest plikiem biblioteki importu, który umożliwia końcowy plik wykonywalny zawierać tabelę adresów importu (IAT), do której odwołują się wszystkie wywołania funkcji DLL. Zasadniczo, umożliwiając sprawdzenie funkcji.

Możesz przeczytać o tym here.

Aby mieć Qt wygenerować lib, dodać to do .pro: -

CONFIG+= staticlib 

Here's jakiejś dokumentacji na temat tworzenia bibliotek.

+0

dzięki @ Merlin069 za odpowiedź. to wyjaśnia! Jedna rzecz: kiedy stworzyłem plik myLib.dll, nie widziałem żadnego sposobu na wygenerowanie pliku lib z plikiem DLL. czy jest to opcja przy budowaniu biblioteki DLL? Ponadto, wszystkie wywołania funkcji w mojej bibliotece DLL wydają się być dostępne również bez pliku lib. Czy nie jest to tym, na co powinien zezwolić plik .lib? dzięki – WewillSee

+0

Domyślnie powinna istnieć biblioteka importu. – ExpatEgghead

+0

Prawdopodobnie w twoim IDE będzie ustawienie do utworzenia pliku lib, jeśli jeszcze go nie ma. O ile rozumiem, bez pliku lib, możesz załadować dll osobno i wywoływać funkcje, ale lib jest wymagana, jeśli chcesz zbudować plik wykonywalny z bibliotekami statycznymi. – TheDarkKnight

3

Moja odpowiedź może nie być specyficzna dla kontekstu, ale byłaby przydatna dla większości programistów zadających to samo pytanie. Ten odpowiedział Anthony Williams

What is inside .lib file of Static library, Statically linked dynamic library and dynamically linked dynamic library?

Nie trzeba plik .lib do korzystania z biblioteki dynamiczne, ale bez jednej nie można traktować funkcji z DLL jako normalnych funkcji w kodzie . Zamiast tego musisz ręcznie wywołać funkcję LoadLibrary, aby załadować bibliotekę DLL (i FreeLibrary, gdy skończysz), i GetProcAddress, aby uzyskać adres URL funkcji lub elementu danych w bibliotece DLL. Następnie należy odrzucić zwracany adres do odpowiedniego wskaźnika do funkcji, aby go użyć.

Powiązane problemy