Export z knihovny DLL pomocí souborů .DEF
Definice modulu nebo def soubor (*.def) je textový soubor obsahující jeden nebo více příkazů modulu, které popisují různé atributy knihovny DLL. Pokud k exportu __declspec(dllexport)
funkcí knihovny DLL nepoužíváte klíčové slovo, knihovna DLL vyžaduje soubor DEF.
Minimální soubor DEF musí obsahovat následující příkazy definice modulu:
Prvním příkazem v souboru musí být příkaz LIBRARY. Tento příkaz identifikuje soubor DEF jako patřící knihovně DLL. Za příkazem LIBRARY následuje název knihovny DLL. Linker umístí tento název do knihovny importu knihovny DLL.
Příkaz EXPORT uvádí názvy a případně pořadové hodnoty funkcí exportovaných knihovnou DLL. Funkci přiřadíte pořadovou hodnotu podle názvu funkce se znaménkem (@) a číslem. Při zadávání řadových hodnot musí být v rozsahu 1 až N, kde N je počet funkcí exportovaných knihovnou DLL. Pokud chcete exportovat funkce podle řad, přečtěte si téma Export funkcí z knihovny DLL podle pořadového čísla, nikoli podle názvu , a také v tomto tématu.
Například knihovna DLL, která obsahuje kód pro implementaci binárního vyhledávacího stromu, může vypadat takto:
LIBRARY BTREE
EXPORTS
Insert @1
Delete @2
Member @3
Min @4
Pokud k vytvoření knihovny MFC DLL použijete Průvodce knihovnou MFC DLL, průvodce pro vás vytvoří soubor DEF kostry a automaticky ho přidá do projektu. Přidejte názvy funkcí, které se mají exportovat do tohoto souboru. Pro knihovny DLL jiné než MFC vytvořte soubor DEF sami a přidejte ho do projektu. Pak přejděte do definičního souboru vstupního modulu Vlastnosti>projektu>>>a zadejte název souboru DEF. Tento krok opakujte pro každou konfiguraci a platformu nebo to udělejte najednou výběrem možnosti Konfigurace = Všechny konfigurace a Platforma = Všechny platformy.
Pokud exportujete funkce v souboru C++, musíte buď umístit zdobené názvy do souboru DEF, nebo definovat exportované funkce se standardním propojením jazyka C pomocí extern "C". Pokud potřebujete umístit dekorované názvy do souboru DEF, můžete je získat pomocí nástroje DUMPBIN nebo pomocí linkeru /MAP . Všimněte si, že zdobené názvy vytvořené kompilátorem jsou specifické pro kompilátor. Pokud umístíte zdobené názvy vytvořené kompilátorem Microsoft C++ (MSVC) do souboru DEF, aplikace, které odkazují na vaši knihovnu DLL, musí být vytvořeny také pomocí stejné verze MSVC, aby zdobené názvy ve volající aplikaci odpovídaly exportovaným názvům v souboru DEF knihovny DLL.
Poznámka:
Knihovnu DLL sestavenou pomocí sady Visual Studio 2015 můžou využívat aplikace vytvořené pomocí sady Visual Studio 2017 nebo Visual Studio 2019.
Pokud vytváříte rozšiřující knihovnu DLL a exportujete pomocí souboru DEF, umístěte následující kód na začátek a konec souborů hlaviček, které obsahují exportované třídy:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA
Tyto řádky zajišťují, aby se proměnné MFC, které se používají interně nebo které jsou přidány do tříd, exportovány (nebo importovány) z knihovny DLL rozšíření MFC. Například při odvození třídy pomocí DECLARE_DYNAMIC
, makro rozbalí a přidá CRuntimeClass
členské proměnné do třídy. Vynechání těchto čtyř řádků může způsobit, že se knihovna DLL zkompiluje nebo nesprávně propojí nebo způsobí chybu, když klientská aplikace odkazuje na knihovnu DLL.
Při sestavování knihovny DLL používá linker soubor DEF k vytvoření souboru exportu (.exp) a souboru knihovny importu (.lib). Linker pak použije soubor exportu k sestavení souboru KNIHOVNY DLL. Spustitelné soubory, které implicitně propojí s odkazem knihovny DLL na knihovnu importu při jejich vytváření.
Všimněte si, že mfc sám používá def soubory k exportu funkcí a tříd z MFCx0.dll.
Co chcete udělat?
Export funkcí jazyka C++ pro použití ve spustitelných souborech jazyka C
Export funkcí jazyka C pro použití ve spustitelných souborech jazyka C nebo C++
Import do aplikace s použitím deklarace __declspec(dllimport)