[英]Unresolved externals despite no external library
我有一个非常简单的 C++ 测试项目,它给了我错误:
error LNK2001: unresolved external symbol "int __cdecl DnsPluginInitialize(void *,void *)" (?DnsPluginInitialize@@YAHPEAX0@Z)
我的头文件是这样的:
#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 注释导出并让__declspec(dllexport)
处理导出,我可以让它为 Win32 编译。 当我使用 DumpBin 查看文件时,我仍然以DnsPluginInitialize@@YAHPEAX0@Z
作为导出签名,但我想我可以使用extern "C"
来避免 32 位版本的这种情况。 编辑:实际上我不能在 32 位和 64 位版本中都使用extern C
吗? 似乎所有 pragma 注释导出试图做的就是让它自己调用函数名,而不必使用修饰名,对吗?
所以现在我很高兴它有效,但我仍然很好奇是什么原因造成的。 我猜这与__cdecl
在 X64 上被忽略以及__cdecl
不支持pragma comment /export 有关系。 但是我对 C++ 的了解还不够,还不能真正知道发生了什么。 如果有人想提出他们的解释,我很想听听他们的意见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.