2014-10-09 70 views
0

所以,我有兩個項目,項目2建立一個DLL我哪裏有這個類(頭和CPP後續)與CPP文件瑣碎的定義導致鏈接錯誤

頭虛函數

class classWvirts 
{ 
    public: 
    classWvirts(){}; 
    ~classWvirts(){}; 

    virtual int testVirtualFunction(); 
}; 

CPP

#include "classWvirts.h" 

int classWvirts::testVirtualFunction() 
{ 
    return 1; 
} 

在項目1項(它建立到一個exe),我只是有一個.cpp文件看起來像這樣:

#include "../testApp2/classWvirts.h" 
classWvirts obj1; 

int main() 
{ 
    obj1.testVirtualFunction(); 
} 

這種設置似乎有所有成分,它的工作,我的方法,但它被標記爲虛擬的,在其CPP文件中一個微不足道的定義。

然而,當我嘗試編譯,我得到一個LNK2001鏈接錯誤,看起來像

錯誤1錯誤LNK2019:無法解析的外部符號 「市民:虛擬INT __thiscall classWvirts :: testVirtualFunction(無效)」(? testVirtualFunction @ classWvirts @@ UAEHXZ)在函數_main中引用E:\ Work \ Scratch \ US1212_Virt \ testApp \ testApp \ Source.obj testApp

有人能指出我做錯了什麼嗎?我意識到,如果我把簡單的定義放在頭文件裏,一切都會奏效,但如果這不是一個選項呢? (這顯然是我在一個大型項目中遇到的問題的簡化版本),將cpp編入一個inl並將其包含在標題中可能有空間,但我寧願避免這種情況並保持cpp和header的區別。

+0

與DLL導入庫的鏈接。也將該類聲明爲dll-export。我不記得確切的語法,它是特定於Microsoft的。 – 2014-10-09 03:07:06

+0

是的,剛剛達到了這個結論:)感謝加強相同。 – angryInsomniac 2014-10-09 03:08:24

回答

2

當你正在使用Visual Studio編譯一個DLL,你必須從DLL庫中的類,宣佈其與__declspec(dllexport)導出庫

class __declspec(dllexport) classWvirts 
{ 
    ... 

而且你必須導入它在主通過在主項目

class __declspec(dllimport) classWvirts 
{ 

爲了使用進口和出口的同一頭文件與__declspec(dllimport)宣佈它的項目,你可以引入一個宏

#define MY_DLL_IMPORT_EXPORT ... 

class MY_DLL_IMPORT_EXPORT classWvirts 
{ 
    ... 

在編譯DLL時您將定義爲__declspec(dllexport),在所有其他情況下將定義爲__declspec(dllimport)(即,當編譯主項目時)。

如果您創建的主要項目對您的DLL項目的依賴時,Visual Studio應該照顧另一個接頭自動設置的(即它會自動連接你的DLL的導入庫主體工程)。如果您沒有該依賴項,則可以創建它或在主項目的鏈接器設置中手動指定DLL導入庫。