尝试链接到DLL时链接器错误

时间:2011-12-07 22:56:24

标签: c++ dll linker-errors

我有一个Dll,它有4个文件头文件-1.StreamReader.h 2.StreamWriter.h源文件-StreamReader.cpp 2.StreamWriter.cpp在Windows VS2008中。

StreamReader.h

Class StreamReader{

public:

static __declspec(dllexport) StreamReader* GetInstance();
//other functions

private:
  StreamReader(){}
  ~StreamReader(){}

  static StreamReader *m_pInstance;
};

StreamReader.cpp

StreamReader *StreamReader::m_pInstance=NULL;

StreamReader *StreamReader::GetInstance()
{
 return((m_pInstance==NULL)?m_pInstance=new StreamReader:m_PInstance);
}

//other functions

我有一个非常类似的StreamWriter结构和一个GetInstance()。

当我在exe中静态链接到这个dll时,它会在编译期间抱怨

  

错误LNK2001:未解析的外部符号“private:static class   StreamReader * StreamReader :: m_pInstance“   (?m_pInstance @ StreamReader @@ 0PAV1 @ A)

     

错误LNK2019:未解决   外部符号“public:static class StreamReader * __cdecl   StreamReader的::的GetInstance(无效)”   (?GetInstance @ StreamReader @@ SAPAV1 @XZ)在函数_main

中引用

exe也是用c ++编写的。但它可以找到StreamWriter符号。除了一个读取和一个写入文件的事实之外,StreamWriter和StreamReader文件基本相同。我错过了什么?谢谢

2 个答案:

答案 0 :(得分:0)

确保.cpp文件实际上在项目中,而不仅仅在文件夹中。这样,编译器就知道要编译它们并生成链接器正在寻找的目标文件。

答案 1 :(得分:0)

导入dll时,需要声明dllimport。 你有     static __declspec(dllexport)StreamReader * GetInstance(); 你需要     static __ declspec(dllimport) StreamReader * GetInstance();

您可以使用预处理器定义

为此使用相同的头文件
#ifdef _EXPORTING
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif

static CLASS_DECLSPEC StreamReader* GetInstance();

确保将_EXPORTING预处理程序定义添加到导出DLL的项目

相关问题