2008-08-29 22 views
32

在C++中構建項目時,我發現調試鏈接錯誤非常棘手,尤其是在挑選其他人的代碼時。人們使用什麼策略來調試和修復鏈接錯誤?調試鏈接錯誤的最佳實踐

回答

22

不知道你的專業水平是什麼,但這裏有基礎知識。

下面是VS 2005的鏈接器錯誤 - 是的,如果你不熟悉它,這是一個巨大的混亂。

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" ([email protected]@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" ([email protected]@[email protected]@[email protected]) 

有幾個點集中在:

  • 「ByteComparator.obj」 - 尋找一個ByteComparator.cpp文件,這是連接問題
  • 「INT源__cdecl does_not_exist(無效)」 - 這是它無法找到符號,在這種情況下,功能名爲does_not_exist()

在這一點上,在許多情況下分辨率的最快方法是搜索t他爲此函數編寫代碼並查找實現的位置。一旦你知道該函數在哪裏實現,你只需要確保兩個地方連接在一起。

如果您使用的是VS2005,您可以使用「Project Dependencies ...」右鍵菜單。如果你使用的是gcc,你可以在makefile文件中查看可執行文件的生成步驟(用一堆.o文件調用gcc)並添加缺少的.o文件。


在第二種情況下,您可能會缺少沒有代碼的「外部」依賴項。 Win32庫通常在靜態庫中實現,您必須鏈接到這些庫。在這種情況下,請轉至MSDN"Microsoft Google"並搜索API。在API描述的底部給出庫名稱。將其添加到項目屬性「Configuration Properties-> Linker-> Input-> Additional Dependencies」列表中。例如,函數timeGetTime()的page on MSDN告訴您在頁面底部使用Winmm.lib。

+0

那麼,如果我找到了實施該方法的地方,並且我沒有發現任何問題,我下一步該做什麼?有沒有辦法獲得鏈接的文件列表?您的答案對初學者來說確實很好,但這是鏈接器調試的前1名結果,並且在函數名稱中還有其他可能的原因,而不是拼寫錯誤。 – 2015-10-26 14:01:11

2

我遇到的一個常見鏈接錯誤是函數的使用與定義方式不同。如果你看到這樣的錯誤,你應該確保你使用的每個函數都在某個.h文件中正確聲明。
您還應該確保所有相關的源文件都被編譯到同一個lib文件中。我遇到的一個錯誤是,當我有兩組文件被編譯成兩個獨立的庫時,我在庫之間進行了交叉調用。

你有沒有想到失敗?

+0

這個交叉調用,它給出了什麼類型的錯誤? – Doug 2013-01-24 19:01:39

3

C運行時庫往往是最大的罪魁禍首。確保你的所有項目都具有相同的設置,包括單線程和多線程以及靜態與dll。

MSDN文檔很適合指出特定Win32 API調用需要的庫,如果它缺少的話。

除此之外,它通常歸結爲打開詳細標誌和涉水尋找線索輸出。