簡體   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