若要確定用于導(dǎo)出函數(shù)的方法(.def 文件或 __declspec(dllexport) 關(guān)鍵字),請回答下列問題:
使用 .DEF 文件的優(yōu)缺點
在 .def 文件中導(dǎo)出函數(shù)使您得以控制導(dǎo)出序號。當(dāng)將附加的導(dǎo)出函數(shù)添加到 DLL 時,可以給它們分配更高的序號值(高于任何其他導(dǎo)出函數(shù))。當(dāng)您進行此操作時,使用隱式鏈接的應(yīng)用程序不必與包含新函數(shù)的新導(dǎo)入庫重新鏈接。這非常重要,例如,在設(shè)計將由許多應(yīng)用程序使用的第三方 DLL 時??梢酝ㄟ^添加附加功能不斷地增強 DLL,同時確?,F(xiàn)有應(yīng)用程序繼續(xù)正常使用新的 DLL。MFC DLL 是使用 .def 文件生成的。
使用 .def 文件的另一個優(yōu)點是:可以使用 NONAME 屬性導(dǎo)出函數(shù),該屬性僅將序號放到 DLL 的導(dǎo)出表中。對具有大量導(dǎo)出函數(shù)的 DLL,使用 NONAME 屬性可以減小 DLL 文件的大小。有關(guān)編寫模塊定義語句的信息,請參見模塊定義語句的規(guī)則。有關(guān)序號導(dǎo)出的更多信息,請參見按序號而不是按名稱從 DLL 導(dǎo)出函數(shù)。
使用 .def 文件的主要缺點是:在 C++ 文件中導(dǎo)出函數(shù)時,必須將修飾名放到 .def 文件中,或者通過使用外部“C”用標(biāo)準(zhǔn) C 鏈接定義導(dǎo)出函數(shù),以避免編譯器進行名稱修飾。
如果需要將修飾名放到 .def 文件中,則可以通過使用 DUMPBIN 工具或 /MAP 鏈接器選項來獲取修飾名。請注意,編譯器產(chǎn)生的修飾名是編譯器特定的。如果將 Visual C++ 編譯器產(chǎn)生的修飾名放到 .def 文件中,則鏈接到 DLL 的應(yīng)用程序必須也是用相同版本的 Visual C++ 生成的,這樣調(diào)用應(yīng)用程序中的修飾名才能與 DLL 的 .def 文件中的導(dǎo)出名相匹配。
使用 __declspec(dllexport) 的優(yōu)缺點
使用 __declspec(dllexport) 非常方便,因為不必考慮維護 .def 文件和獲取導(dǎo)出函數(shù)的修飾名。例如,如果您設(shè)計的 DLL 供自己控制的應(yīng)用程序使用,則此方法很適用。如果通過新的導(dǎo)出函數(shù)重新生成 DLL,還必須重新生成應(yīng)用程序,因為如果使用不同版本的編譯器進行重新編譯,則導(dǎo)出的 C++ 函數(shù)的修飾名可能會發(fā)生變化。