2008-12-02 127 views
5

我正在使用帶有pvcs編譯器的makefile系統(使用Microsoft Visual C++,2008編譯器),並且我得到幾個表單鏈接錯誤:Clrdump(C++)錯誤LNK2019:無法解析的外部符號__imp__RegisterFilter @ 8在函數中引用_main

error LNK2019: unresolved external symbol [email protected] referenced in function _main

這是發生,儘管使用extern "C"聲明,即:

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

此外,在makeexe.mak,該庫被鏈接作爲:

$(COMPILEBASE)\ lib \ clrdump.lib \

說實話,我不是makefiles的專家,我正在將系統從Microsoft Visual C++ 6.0更改爲2008.此轉換可能有與鏈接錯誤有關,就像系統之前使用的那樣。

任何幫助真的不勝感激。

由於事先

真誠, 約瑟夫

- 編輯1 -

有誰知道如何在PVC的makefile文件系統開啓冗長的?

注意上面的功能已經是一個編譯器飾的版本,有

[email protected] 

而C++函數只是

RegisterFilter 

感謝您的幫助,但如果任何人都可以發佈更多完整的解決方案,這也將非常感激。

真誠,約瑟夫

- 編輯2 -

一些善良的人張貼了這個,但是當我在簽署消失:

小鬼前綴表示,此功能是進口來自DLL。檢查CLRDUMP_API的定義 - 是__declspec(dllimport)?有關更多信息,請參閱此文章。

有一個工作鏈接,但我失去了,但我想可以隨時搜索主題。

謝謝,不管你是誰!

- 編輯3 -

感謝ChrisN(我還沒有投票權)。儘管使用刷新按鈕,您的答案消失了,但在我發佈剪切粘貼之後又重新出現了。

這是我的這個定義:

define CLRDUMP_API __declspec(dllimport) __stdcall 

我假設__stdcall是OK?

- 編輯4 -

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

回答

3

我創建在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

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

3

嘗試打開鏈接器的詳細輸出(通常是命令行開關)。這將顯示你的鏈接究竟是如何試圖解決的象徵,所以你可以看到,如果:

  • 符號的簽名是你所期望的
  • 該接頭用在尋找正確的位置是你的庫

我希望這有助於!

14

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

clrdump庫是從this page?如果是這樣,請注意extern "C"未用於隨庫提供的頭文件中。我確認這使用下面的命令:

dumpbin /exports clrdump.lib 

產生以下輸出爲RegisterFilter - 這是一個錯位C++函數名:

[email protected]@[email protected] (int __stdcall RegisterFilter(unsigned short const *,unsigned long))

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

#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)" ([email protected]@[email protected])

代碼使用Visual C++ 6.0編譯爲OK。

請注意,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-),現在代碼生成OK。

對不起,我以前的答案混亂。我希望這更有幫助!

+0

ChrisN:這遠遠超出了這些發帖小組的預期。我試着在調用函數中使用一個強制類型(編譯器扼住了它,它被刪除了),我也嘗試了編譯器選項: /Zc:wchar_t- 在我自己的情況下,儘管先構建一個clean,但仍然失敗! – JosephDoggie 2008-12-02 21:54:59

+1

沒有看到更多的代碼,我不認爲我能夠進一步提供幫助。你有圖書館的源代碼嗎? – ChrisN 2008-12-02 22:11:08

3

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

1

使用DEF文件

如果您選擇使用__declspec(dllimport的)與.def文件一起,你應該改變DEF文件使用數據或常數,以減少的可能性,不正確編碼會造成一個問題:

// 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

5

我最近有同樣的問題。爲了避免碰撞,我排除了一個庫,所有的錯誤都消失了,除了LINK錯誤(就像你描述的那樣)。當我爲另一個庫(我排除(忽略)MSVCRT.lib)替換庫時,現在我排除(忽略)LIBCMT.lib),問題消失了。確保你沒有將庫混合到某處。 在我的情況下,鏈接器失敗,「無法找到imp _aligned_malloc」。 當然,我的任何代碼都沒有這個名字的方法。編譯器預先準備了imp。正是我爲什麼不知道,除了如上所述我交換了exclude(忽略)時問題消失了。

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

相關問題