簡體   English   中英

Clrdump(C ++)錯誤LNK2019:函數_main中引用的未解析的外部符號__imp__RegisterFilter @ 8

[英]Clrdump (C++) error LNK2019: unresolved external symbol __imp__RegisterFilter@8 referenced in function _main

我正在使用makefile系統與pvcs編譯器(使用Microsoft Visual C ++,2008編譯器),我收到的形式有幾個鏈接錯誤:

error LNK2019: unresolved external symbol __imp__RegisterFilter@8 referenced in function _main

使用extern "C"聲明發生DESPITE,即:

extern "C" int CLRDUMP_API RegisterFilter( LPCWSTR pDumpFileName, unsigned long DumpType );

此外,在makeexe.mak中,庫被鏈接為:

$(COMPILEBASE)\\ lib \\ clrdump.lib \\

說實話,我不是makefile的專家,而且我正在將系統從Microsoft Visual C ++ 6.0轉換到2008.這種轉換可能與鏈接錯誤有關,就像以前系統工作一樣。

真的很感激任何幫助。

提前致謝,

真誠的,約瑟夫

- 編輯1 -

有誰知道如何在pvcs的makefile系統中打開詳細信息?

請注意,上面的函數已經是編譯器裝飾的版本了

__imp__RegisterFilter@8

而C ++的功能就是

RegisterFilter

感謝您的幫助,但如果有人可以發布更完整的解決方案,那也將非常感激。

真誠的,約瑟夫

- 編輯2 -

有些人發布了這個,但當我登錄時它消失了:

imp前綴表示此函數是從DLL導入的。 檢查CLRDUMP_API的定義 - 它是__declspec(dllimport)嗎? 有關更多信息,請參閱此文章。

有一個工作鏈接,但我已經失去了,但我想總是可以搜索主題。

謝謝,無論你是誰!

- 編輯3 -

謝謝ChrisN(我還沒有被允許投票)。 盡管使用了刷新按鈕,但你的答案消失了,但是在我發布了一個cut-n-paste之后又重新出現了。

這是我對此的定義:

define CLRDUMP_API __declspec(dllimport) __stdcall

我假設__stdcall沒問題?

- 編輯4 -

雖然我很感謝那些回答的人的努力,特別是ChrisN,至少在我的特定系統上,鏈接錯誤仍然存​​在。 所以如果有人有任何進一步的見解,我會很感激。 再次感謝。

__imp_前綴表示鏈接器期望從DLL導入此函數。

是否來自此頁面的clrdump庫? 如果是這樣,請注意,隨庫提供的頭文件中不使用extern "C" 我使用以下命令確認了這一點:

dumpbin /exports clrdump.lib

它為RegisterFilter生成以下輸出 - 這是一個受損的C ++函數名:

?RegisterFilter@@YGHPBGK@Z (int __stdcall RegisterFilter(unsigned short const *,unsigned long))

我嘗試使用Visual Studio 2008使用clrdump.lib創建示例程序。這是我的代碼:

#include <windows.h>
#include "ClrDump.h"

int _tmain(int argc, _TCHAR* argv[])
{
    RegisterFilter(L"", 0);
    return 0;
}

構建它會產生以下鏈接器錯誤:

LNK2019: unresolved external symbol "__declspec(dllimport) int __stdcall RegisterFilter(wchar_t const *,unsigned long)" (__imp_?RegisterFilter@@YGHPB_WK@Z)

代碼使用Visual C ++ 6.0構建正常。

請注意, dumpbin輸出將RegisterFilter的第一個參數顯示為unsigned short const *但鏈接器錯誤顯示wchar_t const * 在Visual C ++ 6.0中, wchar_t通常是unsigned short的typedef,而在以后的版本中,它是一個獨特的內置類型。

若要解決Visual Studio 2008中的問題,我將“將wchar_t視為內置類型”選項設置為“否”(在編譯器命令行上指定/Zc:wchar_t- ),現在代碼構建正常。

很抱歉與我之前的回答混淆了。 我希望這更有幫助!

我最近遇到了同樣的問題。 我排除了一個庫來避免碰撞,所有的bug都消失了,除了LINK錯誤(就像你描述的那樣)。 當我為另一個庫交換庫時(我排除(忽略)MSVCRT.lib,現在我排除(忽略)LIBCMT.lib)問題消失了。 確保你沒有在某處混合庫。 在我的情況下,鏈接器失敗了“找不到imp _aligned_malloc”。 當然,我的任何代碼中都沒有該名稱的方法。 編譯器在前面加上了imp 究竟為什么我不知道,除了當我交換排除(忽略)時問題消失了,如上所述。

嘗試從一個新項目開始,重新添加源文件和頭文件,並跟蹤您排除的庫(忽略)。 嘗試各種組合。 希望有所幫助。

我在VS2005中創建了一個簡單的Win32 c ++應用程序,我收到了這個錯誤:

LNK2019: unresolved external symbol __imp__somefunction

此應用程序使用屬性表,因此它需要此標頭(prsht.h)。

我的問題的解決方案如下:在程序屬性→配置屬性→鏈接器→常規 ,我將其他庫目錄設置為"C:\\Program Files\\Microsoft Visual Studio 8\\VC\\PlatformSDK\\Lib"

此外,在程序屬性→配置屬性→鏈接器→ 附加選項的 命令行中,我添加了ComCtl32.Lib ComDlg32.Lib

我的程序現在編譯沒有任何問題。 我的兩分錢:您需要識別您的程序所需的所有庫。 提示:檢查您包含的所有標頭,您需要確保鏈接器可以看到它們。

嘗試為鏈接器打開詳細輸出(通常是命令行開關)。 這將向您顯示鏈接器嘗試解析符號的確切方式,以便您可以查看:

  • 符號的簽名就是你所期望的
  • 鏈接器正在查找您的庫的正確位置

我希望這有幫助!

不知道是不是你的情況,但imp前綴可能意味着你正在Win32項目中編譯x64庫。

使用.DEF文件

如果選擇使用__declspec(dllimport)和.DEF文件,則應更改.DEF文件以使用DATA或CONSTANT來降低錯誤編碼導致問題的可能性:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   CONSTANT

下表顯示了原因:

Keyword      Emits in the import library   Exports
CONSTANT     _imp_ulDataInDll              _ulDataInDll
             _ulDataInDll                  

DATA         _imp_ulDataInDll              _ulDataInDll

http://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM