2012-04-05 134 views
1

我創建了一個DLL項目併成功構建它。然後我試圖在另一個項目TEST中使用該DLL,並且出現以下錯誤。錯誤LNK2001:與DLL無法解析的外部符號

Error 1 error LNK2001: unresolved external symbol "public: void __thiscall SnoMessage::setRawMessageName(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" ([email protected]@@[email protected][email protected][email protected][email protected]@@@@@[email protected]@@Z) 

我在鏈接器屬性中添加了必需的lib,並且我還在TEST include目錄中添加了頭文件。所以這個功能正在被識別,但它一直給出這些錯誤。該DLL包含以下文件的

SnoMessage.h

#pragma once 
#include "StdAfx.h" 
class SnoMessage 
{ 
public: 
    __declspec(dllexport) SnoMessage(void); 
    __declspec(dllexport) ~SnoMessage(void); 
    __declspec(dllexport) void setRawMessageName(CString messageName); 
    __declspec(dllexport) void setRawMessageType(CString messageType); 
    __declspec(dllexport) void setRawMessageAttributes(std::map<CString,CString> attributes); 
    __declspec(dllexport) CString getRawMessageName(); 
    __declspec(dllexport) CString getRawMessageType(); 
    __declspec(dllexport) std::map<CString,CString> getRawMessageAttributes(); 

private: 
    CString messageName; 
    CString messageType; 
    std::map<CString,CString> attributes; 
}; 

SnoMessage.cpp

#include "stdafx.h" 
#include "SnoMessage.h" 


SnoMessage::SnoMessage(void) 
{ 
} 


SnoMessage::~SnoMessage(void) 
{ 
} 

void SnoMessage::setRawMessageName(CString messageName){ 
    this->messageName = messageName; 
} 

void SnoMessage::setRawMessageType(CString messageType){ 
    this->messageType = messageType; 
} 

void SnoMessage::setRawMessageAttributes(std::map<CString,CString> attributes){ 
    this->attributes = attributes; 
} 

CString SnoMessage::getRawMessageName(){ 
    return messageName; 
} 

CString SnoMessage::getRawMessageType(){ 
    return messageType; 
} 

std::map<CString,CString> SnoMessage::getRawMessageAttributes(){ 
    return attributes; 
} 

而且在測試我做了以下內容:

test.cpp

// test.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "SnoMessage.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    SnoMessage *msg = new SnoMessage(); 
    msg->setRawMessageName("TEST"); 
    return 0; 
} 

讓我知道你是否需要更多信息,謝謝。

+0

小心評論-1? – PTBG 2012-04-05 17:28:43

+0

兩個項目都使用ATL嗎?兩個項目都有相同的運行時庫嗎?檢查常規 - > ATL和使用C/C++ - >代碼發生 - >運行時庫 – devshorts 2012-04-05 18:09:24

+0

@devshorts是,無論是運行庫,並使用ATL都在這兩個項目均 – PTBG 2012-04-05 18:19:39

回答

10

在DLL中要使用你的出口DEFS一些頭定義這個...

MyExports.h

#ifdef SNOMESSAGE_EXPORTS 
#define SNOMESSAGE_API __declspec(dllexport) 
#else 
#define SNOMESSAGE_API __declspec(dllimport) 
#endif 

現在,在您的DLL您剛剛定義SNOMESSAGE_EXPORTS,那麼當你的DLL編譯你的類和方法將可見的EXE。但是當你在exe中包含相同的頭文件時,宏將導入它們而不是導出。

//In the DLL this is == to export, in the executable this is import. Problem solved. 
class SNOMESSAGE_API SnoMessage 
{ 
public: 
//... 
}; 

您不再需要導出每個成員,只是類。

0

我會將整個班級標記爲導出,而不僅僅是其成員函數。另外,根據this conversation的建議,您需要根據是否在DLL中包含頭文件或使用該DLL的代碼來指定__declspec(dllecport)__declspec(dllimport);並在DLL項目中定義守護宏。

0

當您編譯DLL你應該有__declspec(dllexport)的,但是當你編譯EXE,你應該有__declspec(dllimport的)。最簡單的方法是在「在DLL中」和「在DLL之外」時在#define的某個地方有不同的值。還要導出整個班級而不是單獨的方法。

相關問題