2016-06-10 86 views
0

這可能是重複的,但有太多問題,我不能全部閱讀它們。這裏是我的問題:我收到以下錯誤信息:錯誤LNK2019 - 名稱裝飾 - 缺少__imp_

4>ScatterometerView.obj : error LNK2019: unresolved external symbol 
"__declspec(dllimport) public: __thiscall CPGLGraphBitDlgBSDF::CPGLGraphBitDlgBSDF(class CPGLGraph *)" ([email protected]@[email protected]@@@Z) 
referenced in function "public: void __thiscall CScatterometerView::DisplayBSDFPlot(class BSDF *)" ([email protected]@@[email protected]@@Z) 

當我看的DUMPBIN輸出,我看到我的構造

12 B 00002EFF [email protected]@[email protected]@@@Z = @ILT+7930([email protected]@[email protected]@@@Z) 

它除了__imp__一切。在DLL類被定義如下:

#define PGL_EXT_CLASS _declspec(dllexport) 
class PGL_EXT_CLASS CPGLGraphBitDlgBSDF : public CPGLGraphDlg 
{ 
public: 
    static const int numPointsToAvg = 3; 
    CPGLGraphBitDlgBSDF(); 
    CPGLGraphBitDlgBSDF(CPGLGraph* _pGraph); 
    ~CPGLGraphBitDlgBSDF(void); 
    // ...lots more functions... 
} 

和在可執行文件中的用法是:

CPGLGraph* pGraph = new CPGLGraph; 
// ...code to fill in the graph data... 
m_bsdf_plot = new CPGLGraphBitDlgBSDF(pGraph); 

起腳的是,在每類其他功能工作;只有最近添加的兩個(包括此構造函數)不起作用。舊功能沒有__imp__裝飾,似乎是我新添加的功能所需要的。

創建的.def文件沒有定義函數,所以這似乎沒有區別。我在鏈接器上使用了MAP file,並且前綴__imp__的唯一函數是由Microsoft定義的那些函數。沒有在PGL.dll中定義的單一功能,它們都工作正常。請告訴我在哪裏尋找問題,甚至是線索。

回答

0
#pragma once 
#if defined DLL_EXPORT 
#define MY_API_NAME __declspec(dllexport) 
#else 
#define MY_API_NAME __declspec(dllimport) 
#endif 

通常情況下,您的.hpp文件位於您的DLL中。您需要在DLL項目的預處理器設置中定義DLL_EXPORT,以便在構建DLL時導出函數,並在不同項目中使用它時導入。

+0

好點。我的代碼基於PGL(繪圖圖形庫),並且代碼幾乎與您的PGL.h中已存在的代碼一樣,該代碼包含在我的文件中。任何其他想法? –

+0

我不確定,但嘗試全部手動導出類的功能。就像在構造函數/析構函數/函數前寫PGL_EXT_CLASS一樣。也許班上有什麼東西不能出口,前一陣子發生在我身上。 –

+0

另一個好主意!不幸的是,當我嘗試它時,我收到以下錯誤消息:「用dllexport/dllimport聲明的類的成員本身不能用這樣的說明符聲明」。所以現在肯定的是,這個類是用dllexport聲明的,我不能使用你的最新建議。至少我學到了一些東西。 –