【问题标题】:Linker error when trying to link to a dll尝试链接到 dll 时出现链接器错误
【发布时间】:2012-01-15 11:11:25
【问题描述】:

我有一个 Dll,它有 4 个文件头文件-1.StreamReader.h 2.StreamWriter.h 源文件-StreamReader.cpp 2.StreamWriter.cpp in 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:无法解析的外部符号“私有:静态类 StreamReader * StreamReader::m_pInstance" (?m_pInstance@StreamReader@@0PAV1@A)

错误 LNK2019:未解决 外部符号“公共:静态类 StreamReader * __cdecl StreamReader::GetInstance(void)" (?GetInstance@StreamReader@@SAPAV1@XZ) 在函数_main中引用

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

【问题讨论】:

  • StreamREAder 中有趣的大写字母是转录到 Stack Overflow 时的错误(使用复制和粘贴!)还是您的源代码中有错误?
  • 这是一个很酷的问题......但遗憾的是,这只是我的打字技巧而不是我的编程的一个缺点!
  • 不要输入...直接复制进去。
  • 静态链接到DLL是什么意思?您是否正在链接导入库?使用 dumpbin 检查符号是否正确导出。
  • @Gene 哦,我的意思是链接到导入库,dumpbin 向我显示了错误中显示的 GetInstance() 方法的确切名称。

标签: c++ dll linker-errors


【解决方案1】:

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

【讨论】:

  • 好点。但是是的,cpp 文件确实是 buid 的一部分
【解决方案2】:

当您导入 dll 时,您需要声明 dllimport。 你有 静态 __declspec(dllexport) StreamReader* GetInstance(); 你需要 静态 __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 的项目中

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多