错误LNK2001:带有DLL的未解析的外部符号

PTB*_*TBG 1 c++ visual-studio-2010

我创建了一个DLL项目并成功构建它.然后我尝试在另一个Project,TEST中使用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> > >)" (?setRawMessageName@SnoMessage@@QAEXV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z)
Run Code Online (Sandbox Code Playgroud)

我在链接器属性中添加了所需的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;
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

在测试中,我正在做以下事情:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请告诉我,谢谢.

小智 12

在你的DLL中,你想要用于导出defs的某个头文件中定义这个...

MyExports.h

#ifdef SNOMESSAGE_EXPORTS
#define SNOMESSAGE_API __declspec(dllexport)
#else
#define SNOMESSAGE_API __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

现在在你的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:
//...
};
Run Code Online (Sandbox Code Playgroud)

您不再需要导出每个成员,只需要导出类.