我有一个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文件基本相同。我错过了什么?谢谢
答案 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的项目