尽管没有外部库,但未解析的外部 我有一个非常简单的C++测试项目,它给了我错误: error LNK2001: unresolved external symbol "int __cdecl DnsPluginInitialize(void *,void *)" (?DnsPluginInitialize@@YAHPEAX0@Z)
我的头文件如下所示:尽管没有外部库,但未解析的外部 我有一个非常简单的C++测试项目,它给了我错误: error LNK2001: unresolved external symbol "int __cdecl DnsPluginInitialize(void *,void *)" (?DnsPluginInitialize@@YAHPEAX0@Z),c++,visual-c++,C++,Visual C++,我的头文件如下所示: #ifdef DNSPLUGIN_EXPORTS #define DNSPLUGIN_API __declspec(dllexport) #else #define DNSPLUGIN_API __declspec(dllimport) #endif DNSPLUGIN_API int DnsPluginInitialize(PVOID, PVOID); 我的cpp文件是这样的: #include "stdafx.h" #include "DnsPlugin.h"
#ifdef DNSPLUGIN_EXPORTS
#define DNSPLUGIN_API __declspec(dllexport)
#else
#define DNSPLUGIN_API __declspec(dllimport)
#endif
DNSPLUGIN_API int DnsPluginInitialize(PVOID, PVOID);
我的cpp文件是这样的:
#include "stdafx.h"
#include "DnsPlugin.h"
#pragma comment(linker,"/EXPORT:DnsPluginInitialize=?DnsPluginInitialize@@YAHPEAX0@Z")
DNSPLUGIN_API int DnsPluginInitialize(PVOID a1, PVOID a2) {
return 0;
}
我对C++非常陌生,花了很多时间试图解决这个问题,但是就是无法到达那里,因为所有的网络似乎都暗示我缺少一个外部图书馆……但我没有用
如有帮助,请提供更多信息:
这是Visual Studio 2010中的win32 DLL项目
DnsPluginInitialize函数需要由外部程序调用,而且显然此导出签名是正确的(我在示例中看到其他人使用此代码)因此,x86与x64之间的差异似乎是一个问题。。。这不是我从错误消息中猜到的 如果我将项目更改为针对x64平台,它将立即编译,不会出现错误。但是,一旦我切换回Win32,我就会收到关于未解析外部符号的相同错误 但是,如果我删除pragma注释导出并让
\uu declspec(dllexport)
处理导出,我就可以让它为Win32编译。我仍然以DnsPluginInitialize结束@@YAHPEAX0@Z
作为使用DumpBin查看文件时的导出签名,但我想我可以使用extern“C”
来避免32位版本的导出签名编辑:实际上我不能对32位和64位版本都使用extern C
?看起来pragma注释导出所要做的就是让它自己调用函数名,而不必使用修饰名,对吗
所以现在我很高兴它能起作用,但我还是很好奇是什么原因造成的。我猜这与
\uu cdecl
与pragma comment/export结合有关。但是我对C++还不太了解,还不知道到底发生了什么。如果有人想提出他们的解释,我很想听听。所以这似乎是x86和x64差异的问题。。。这不是我从错误消息中猜到的
如果我将项目更改为针对x64平台,它将立即编译,不会出现错误。但是,一旦我切换回Win32,我就会收到关于未解析外部符号的相同错误
但是,如果我删除pragma注释导出并让\uu declspec(dllexport)
处理导出,我就可以让它为Win32编译。我仍然以DnsPluginInitialize结束@@YAHPEAX0@Z
作为使用DumpBin查看文件时的导出签名,但我想我可以使用extern“C”
来避免32位版本的导出签名编辑:实际上我不能对32位和64位版本都使用extern C
?看起来pragma注释导出所要做的就是让它自己调用函数名,而不必使用修饰名,对吗
所以现在我很高兴它能起作用,但我还是很好奇是什么原因造成的。我猜这与
\uu cdecl
与pragma comment/export结合有关。但是我对C++还不太了解,还不知道到底发生了什么。如果有人想提出他们的解释,我很乐意听取他们的解释。这是否回答了你的问题?外部符号不一定意味着外部库。请查看obj文件,查看您的DnsPluginInitialize
是如何结束的。也许它不是\uu cdecl
。它可能是缺少的extern“C”{…}
?@tedlynmo使用extern“C”
并摆脱pragma链接器导出似乎是关键,谢谢(尽管奇怪的是,如果我更改为目标x64,即使使用pragma导出,它也可以正常工作)这是否回答了您的问题?外部符号不一定意味着外部库。请查看obj文件,查看您的DnsPluginInitialize
是如何结束的。也许它不是\uu cdecl
。它可能是一个缺少的extern“C”{…}
?@TEDLYNGOM使用extern“C”
,并且摆脱pragma链接器导出似乎是关键,谢谢(尽管奇怪的是,如果我更改为目标x64,即使使用pragma导出,它也可以正常工作),而不是干扰dllexport
,只需使用DEF
文件即可。这样,您就可以指定导出的确切名称。只需使用DEF
文件,而不用处理dllexport
。用于指定导出的确切名称。