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