1

DLLプロジェクトを作成し、正常にビルドしました。次に、別のプロジェクトである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)

リンカのプロパティに必要な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;
}

さらに情報が必要な場合はお知らせください。ありがとうございます。

4

4 に答える 4

12

dllで、エクスポート定義に使用するヘッダーでこれを定義します...

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:
//...
};

クラスだけでなく、各メンバーをエクスポートする必要がなくなりました。

于 2012-04-10T21:57:29.670 に答える
0

メンバー関数だけでなく、クラス全体をエクスポート済みとしてマークします。また、この会話のアドバイスに従って、DLLにヘッダーを含めるか、DLLを使用するコードを含める__declspec(dllecport)__declspec(dllimport)に基づいて指定する必要があります。DLLプロジェクトで保護マクロを定義します。

于 2012-04-09T21:28:59.697 に答える
0

DLLをコンパイルするときは__declspec(dllexport)が必要ですが、exeをコンパイルするときは__declspec(dllimport)が必要です。これを行う最も簡単な方法は、「DLL内」と「DLL外」で異なる値を持つ#defineをどこかに置くことです。また、個々のメソッドではなく、クラス全体をエクスポートしてください。

于 2012-04-09T22:06:12.320 に答える
0

dllコンパイルはC呼び出しを使用し、exeは標準呼び出しを使用する場合がありますが、x64のリンクは問題ありませんが、win32を使用すると、このリンクエラー2001が表示されます。 (https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/name-decoration?view=msvc-160)。

于 2021-01-20T00:48:41.537 に答える