繁体   English   中英

尽管没有外部库,但未解决的外部问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM