2014-11-22 42 views
-1

我想建立一個DLL以及我的程序在C++中。該dll將是一個基礎庫,包含一系列可繼承的類和一般實用程序,然後可以由最終產品附帶的多個其他應用程序動態使用(A遊戲)。我把東西扔在一起,只是發現我收到我瘋狂的錯誤。這是着名的「錯誤LNK2019:無法解析的外部符號」。首先,我已經找到了解決辦法,以下是鏈接:Unresolved External Symbol- Error in guide?討厭的DLL問題(無法解析的外部符號)

所選答案有效。 如果我只將我的類放入一個頭文件,它編譯得非常好,運行,並且非常漂亮。但是,我希望將聲明和實現分開,如果我嘗試將實現移至單獨的cpp,則會收到LNK2019錯誤。這是由於某種內聯,我只想知道我在我開始撕掉頭髮之前如何修補它。

任何人都可以幫助我嗎?這裏是我的課:

頁眉:

#ifndef MYDLLTESTCLASS_H 
#define MYDLLTESTCLASS_H 
class __declspec(dllexport) MyDLLTestClass { 
    public: 
    MyDLLTestClass(); 
    void setX(int x); 
    int getX(); 
    private: 
    int x; 
}; 
#endif // MYDLLTESTCLASS_H 

CPP:

#include "MyDLLTestClass.h" 

MyDLLTestClass::MyDLLTestClass() { 

} 

void MyDLLTestClass::setX(int x) { 
    this->x = x; 
} 

int MyDLLTestClass::getX() { 
    return x; 
} 

獨立像上面的代碼不會編譯。但是,如果我把它們的聲明和實施放在一起,那麼它可以工作,所以如果我這樣做:

#ifndef MYDLLTESTCLASS_H 
#define MYDLLTESTCLASS_H 
class __declspec(dllexport) MyDLLTestClass { 
    public: 
    MyDLLTestClass(); 
    void setX(int x); 
    int getX(); 
    private: 
    int x; 
}; 


MyDLLTestClass::MyDLLTestClass() { 

} 

void MyDLLTestClass::setX(int x) { 
    this->x = x; 
} 

int MyDLLTestClass::getX() { 
    return x; 
} 
#endif // MYDLLTESTCLASS_H 

它會工作。我想再次聲明和實施是分開的。

下面是我使用單獨聲明和實現時的構建報告。

http://pastebin.com/HMEpeEgn

+0

哪個符號未解決? – 2014-11-22 07:11:08

+0

@JonathanPotter我認爲我的評論被刪除了......我添加了一個鏈接到構建輸出到我的帖子的底部讓你看看。 – Krythic 2014-11-22 07:22:20

+1

你的問題是頭文件中類的declspec。您不會有條件地爲您的DLL的*消費者*使用'__declspec(dllimport)'。有一個默認的DLL項目聲明宏來處理這個問題的原因。您的錯誤日誌沒有鏈接DLL的問題;它是*客戶*找不到符號。 – WhozCraig 2014-11-22 07:59:10

回答

0

這實際上是更容易解決比我認識;事實證明,這一直是一個視覺工作室的設置。首先,您需要將dll項目添加到您當前的項目(將使用它)。然後,你需要對上單擊當前項目,並按照這兩張照片:

enter image description here

,然後添加你的DLL,這可能只是需要檢查標記(我的是簡單地錯過了標記)。

enter image description here

後,你的項目將編譯完全沒有問題!沒有必要像每個網頁試圖描繪的那樣令人討厭的屁股#ifndef宏