2012-04-05 32 views
1

DLLプロジェクトを作成して正常にビルドしました。次に、別のProject、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インクルードディレクトリにヘッダーファイルも追加しました。関数は認識されていますが、それらのエラーを与え続けます。 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

+0

どちらのプロジェクトもATLを使用していますか?両方のプロジェクトが同じランタイムライブラリを持っていますか?一般的な使用→ATLとC/C++の使用→コードGEneration→ランタイムライブラリ – devshorts

+0

@devshortsはい、両方のランタイムライブラリとATLの使用はどちらのプロジェクトでも同じです – PTBG

答えて

10

...あなたは、輸出defsのに使用するいくつかのヘッダーであなたのdllで今

MyExports.h

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

これを定義するあなたは自分のdllそして、SNOMESSAGE_EXPORTSを定義しますあなたのクラスがコンパイルされ、メソッドが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)が必要です。これを行う最も簡単な方法は、 "in DLL"と "out of DLL"が異なる値を持つ#defineをどこかに持つことです。また、個々のメソッドの代わりにクラス全体をエクスポートします。あなたのDLL内

関連する問題