2010-10-02 218 views
4

我有一個奇怪的問題,沒有純虛函數從DLL導出。 DLL編譯並輸出爲.dll文件到目錄。但它不會生成.lib文件。如何從C++中的DLL導出純虛函數?

如果我給出定義,它不再是remual作爲純虛擬,然後它愉快地創建.lib文件。

我需要實現工廠模式,我需要分離接口和實現。我的工廠實現和其他使用想要.dll(whome .lib文件不生成)的接口需要使用該導出函數,並且當我使用這些函數時,它們會產生鏈接錯誤...

例如「error LNK2011:解析外部符號「公用:.......」

有任何一個知道如何導出純虛函數,使他們能夠對其他的exe和dll的

問候 烏斯曼

+0

[不需要導出只有虛擬/內聯函數的類?](http:// stackoverflow。com/questions/549983 /不必要的出口類只帶虛擬內聯函數) – 2010-10-02 14:23:09

回答

6

當您導出從​​正在創建該DLL中一些具體的外部可見名DLL的​​東西 - 一個定義的函數或類。如果沒有這些,導入項目(引用該DLL的項目)的鏈接步驟無法解析導出DLL中的函數和類的所有必需的引用。

對於純虛擬函數,導出DLL中沒有具體的「事物」:不存在可鏈接的名稱來解析對純虛函數的外部調用 - 如果存在,則根據定義它將不是純粹的。在這種情況下,所需要的只是純虛函數的編譯時可訪問頭文件中的聲明,以便導入EXE或DLL知道如何用具體函數覆蓋它。

1

在C++中,您可以定義純虛擬方法。例如:

// T.hpp 
class T 
{ 
    public : 
     virtual void doSomething() = 0 ; 
     // etc. 
} ; 

。現在

// T.cpp 
void T::doSomething() 
{ 
} 

// etc. 

,與加在T類DLLEXPORT/dllimport的符,你doSomething方法將用於出口。

定義純虛擬方法的主體的關鍵是確保用戶會覆蓋該方法,同時仍提供默認實現。

我自己使用這種模式是爲了避免在出於某種原因,虛擬方法在存在之前被調用,或者當它不再存在時(即,在基礎摘要的構造函數或析構函數中類)。在調試模式下,它將啓動調試器(::DebugBreak() Win32 API函數),並且在發佈模式下,它將默默無聞。

但是這種模式也可以用來解決你的問題,如果你真的需要導出你的純虛函數的話。

+0

就我個人而言,當客戶端程序員擰緊時,我認爲崩潰可以默默無聞地做任何事情。 – 2010-10-02 17:32:06

+0

@John Dibling:我同意,但至少,重載純虛擬方法讓用戶選擇。就我而言,我會記錄該問題,然後拋出一個運行時異常,並顯示消息「您調用了此方法,這是錯誤的,等等等等等等」。 – paercebal 2010-10-02 18:11:06