尽管没有外部库,但未解析的外部 我有一个非常简单的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
。用于指定导出的确切名称。