在我的项目中尝试使用DLL时,我遇到了LNK2019问题。
详细信息:
__declspec(dllexport)),以便导出dll1中的类(用于dll2使用)。为什么我会有这个错误?
发布于 2009-11-19 14:29:41
关于LNK2019的MSDN页面已经给出了很多为什么会发生这个错误的例子。为了追踪到底发生了什么,我建议这样做:
undname (有关如何运行undname的示例,请参见查看修饰名称 )。dumpbin /EXPORTS (或使用图形依赖沃克)获取由DLL1导出的所有符号的列表。现在,您有了链接器要查找的符号的模糊名称,还有由DLL1导出的符号列表。链接器告诉您,它在列表中找不到所请求的符号。这里有两个关于正在发生的事情的想法:
__declspec(dllexport)的声明中缺少了一些DLL1。发布于 2009-11-19 14:20:08
对于常规的静态类方法,declspec(dllexport)应该足够了,但是在某些情况下(例如内联朋友函数),您需要为函数提供declspec(dllexport)。
例如:
#define DLLEXPORT __declspec(dllexport)
class DLLEXPORT A {
A();
int somefunc();
DLLEXPORT friend int operator==(const A &ws1, const A &ws2)
{ /* some code */ }
}; 发布于 2009-11-19 14:41:50
只是猜测:
如果您将来自dll1的头包含在dll2项目中,并且在该报头中使用__declspec(dllexport)),则会告诉链接器dll2也正在导出这些类,这些类实际上是由dll2导入的,缺少类定义也是如此。
所以人们通常会使用这样的定义。
#ifdef DLL1_EXPORTS
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
class DLLEXPORT A
{
//...此结构确保在dll1定义在dll1中使用标头时导出,在dll2项目中使用时导入。您只需要在编译dll1时定义宏dll1。dll1的项目设置通常是一个很好的地方。
另一种方法是有两个不同的头,一个用于构建dll1,另一个用于dll1的库(没有任何__declspec(dllexport))。
https://stackoverflow.com/questions/1763480
复制相似问题