Eksportowanie z biblioteki DLL przy użyciu plików DEF
Definicja modułu lub plik DEF (*.def) to plik tekstowy zawierający co najmniej jedną instrukcję modułu, która opisuje różne atrybuty biblioteki DLL. Jeśli nie używasz słowa kluczowego __declspec(dllexport)
do eksportowania funkcji biblioteki DLL, biblioteka DLL wymaga pliku DEF.
Minimalny plik DEF musi zawierać następujące instrukcje definicji modułu:
Pierwsza instrukcja w pliku musi być instrukcją LIBRARY. Ta instrukcja identyfikuje plik DEF jako należący do biblioteki DLL. Po instrukcji LIBRARY następuje nazwa biblioteki DLL. Konsolidator umieszcza tę nazwę w bibliotece importu biblioteki DLL.
Instrukcja EXPORT zawiera nazwy i, opcjonalnie, wartości porządkowe funkcji wyeksportowanych przez bibliotekę DLL. Przypisz funkcję wartość porządkową, postępując zgodnie z nazwą funkcji z znakiem (@) i liczbą. Po określeniu wartości porządkowych muszą znajdować się w zakresie od 1 do N, gdzie N to liczba funkcji eksportowanych przez bibliotekę DLL. Jeśli chcesz wyeksportować funkcje według porządkowych, zobacz Eksportowanie funkcji z biblioteki DLL według porządkowych, a nie według nazwy , jak również w tym temacie.
Na przykład biblioteka DLL zawierająca kod implementujący drzewo wyszukiwania binarnego może wyglądać następująco:
LIBRARY BTREE
EXPORTS
Insert @1
Delete @2
Member @3
Min @4
Jeśli używasz Kreatora biblioteki MFC DLL do utworzenia biblioteki MFC DLL, kreator utworzy szkieletowy plik DEF dla Ciebie i automatycznie doda go do projektu. Dodaj nazwy funkcji do wyeksportowania do tego pliku. W przypadku bibliotek DLL innych niż MFC utwórz plik DEF samodzielnie i dodaj go do projektu. Następnie przejdź do pliku definicji modułu wejściowego>konsolidatora>właściwości>projektu>i wprowadź nazwę pliku DEF. Powtórz ten krok dla każdej konfiguracji i platformy lub zrób to wszystko jednocześnie, wybierając pozycję Konfiguracja = Wszystkie konfiguracje i Platforma = Wszystkie platformy.
Jeśli eksportujesz funkcje w pliku C++, musisz umieścić nazwy ozdobione w pliku DEF lub zdefiniować wyeksportowane funkcje za pomocą standardowego powiązania języka C przy użyciu extern "C". Jeśli musisz umieścić nazwy ozdobione w pliku DEF, możesz je uzyskać przy użyciu narzędzia DUMPBIN lub za pomocą konsolidatora /MAP opcji. Należy pamiętać, że nazwy ozdobione tworzone przez kompilator są specyficzne dla kompilatora. W przypadku umieszczenia nazw ozdobionych utworzonych przez kompilator Języka Microsoft C++ (MSVC) w pliku DEF aplikacje łączące się z biblioteką DLL muszą być również skompilowane przy użyciu tej samej wersji MSVC, aby nazwy ozdobione w aplikacji wywołującej odpowiadały wyeksportowanym nazwom w pliku DEF biblioteki DLL.
Uwaga
Biblioteka DLL utworzona za pomocą programu Visual Studio 2015 może być zużywana przez aplikacje utworzone za pomocą programu Visual Studio 2017 lub Visual Studio 2019.
Jeśli tworzysz bibliotekę DLL rozszerzenia i eksportujesz przy użyciu pliku DEF, umieść następujący kod na początku i na końcu plików nagłówkowych zawierających wyeksportowane klasy:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA
Te wiersze zapewniają, że zmienne MFC używane wewnętrznie lub dodawane do klas są eksportowane (lub importowane) z biblioteki DLL rozszerzenia MFC. Na przykład podczas wyprowadzania klasy za pomocą makra DECLARE_DYNAMIC
rozszerza się, aby dodać zmienną składową CRuntimeClass
do klasy. Pozostawienie tych czterech wierszy może spowodować niepoprawne skompilowanie lub połączenie biblioteki DLL albo wystąpienie błędu, gdy aplikacja kliencka łączy się z biblioteką DLL.
Podczas kompilowania biblioteki DLL konsolidator używa pliku DEF do utworzenia pliku eksportu (exp) i pliku biblioteki importu (.lib). Konsolidator następnie używa pliku eksportu do skompilowania pliku DLL. Pliki wykonywalne, które niejawnie łączą się z linkiem DLL do biblioteki importu podczas ich tworzenia.
Należy pamiętać, że sam MFC używa plików DEF do eksportowania funkcji i klas z MFCx0.dll.
Co chcesz zrobić?
Eksportowanie z biblioteki DLL przy użyciu biblioteki __declspec(dllexport)
Eksportowanie funkcji języka C++ do użycia w plikach wykonywalnych języka C
Eksportowanie funkcji języka C do użycia w plikach wykonywalnych języka C lub C++
Importowanie do aplikacji przy użyciu atrybutu __declspec(dllimport)