![](/img/trans.png)
[英]C++ error LNK2019: unresolved external symbol _main referenced in function _tmainCRTStartup
[英]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.