2012-07-26 66 views
1

我是C++和VS中的錯誤經驗,我無法弄清楚我做錯了什麼,更重要的是如何解決它。在不同的項目中使用頭文件時出現LINK2001錯誤

我正在處理多個項目的解決方案,現在開始在另一個項目中使用一個項目中的類。不過,我得到這個錯誤:

tlibdecoder.lib(TDecCu.obj) : error LNK2001: unresolved external symbol "public: void __thiscall CURegister::registerCU(int,int,int)" ([email protected]@@[email protected])

問題似乎是我使用的TDecCu.cpp的功能,這是從文件CURegister.h和CURegister.cpp。我包含CURegister.h,所以函數被定義(我可以在同一個項目中通過導入CURegister.h來正常使用它),但是當我把頭文件包含到TDecCu.cpp中時(通過在頂部添加#include「CURegister.h」)似乎存在問題。

有人可以告訴我如何解決這個問題嗎?請記住我沒有經驗,所以不介意解釋它真的很簡單;)

在此先感謝。 乙

回答

3

「未解決的符號錯誤」是連接器錯誤,與編譯器錯誤相反。鏈接是Visual Studio等IDE中似乎只有一個「構建」事件的第二階段。

這裏的核心問題涉及the distinction between declarations and definitions in C++。總之,一個聲明引入了一個符號(如功能)到編譯,而定義提供實際實例/實施該符號爲接頭的。當考慮一個函數時,這個定義就是你可能聽說過的一個原型。類似這樣的:

void registerCu(int x, int y, int depth); 

請注意,它沒有提供函數的實現,所以它只是一個定義。這是從一個聲明,它提供了全面實施不同:

void registerCu(int x, int y, int depth) 
{ 
    // do magic stuff here 
} 

如果這是一個單一的,自包含的項目,你可以假設鏈接錯誤是提醒你,你未能提供定義的功能。這可能意味着你在一個頭文件的某處寫了一個原型,但實際上並沒有在對應的.cpp文件中寫入該函數的內容。

但是因爲您對infact的回答的評論表明您確實已經在a中提供了實現。cpp文件,並且該問題表示您正在處理多個項目,所以更有可能第二個項目無法找到函數定義。你已經包含了第一個爲第二個項目提供聲明的項目頭文件,所以編譯器很高興。但是當鏈接器開始嘗試鏈接到該函數調用的目標代碼時,它會失望,因爲它找不到定義。

通過指示第二個項目的鏈接程序爲第一個項目的目標代碼查找找不到的任何定義來修復此問題。通常通過將包含第一個項目的構建輸出的文件夾的路徑添加到第二個項目的鏈接器設置來完成此操作。

+0

正如您所說的,必須指示鏈接器在另一個項目的輸出路徑中查找目標代碼。謝謝! – user1554056 2012-07-26 13:45:04

0

您應該添加這兩種CURegister.h和CURegister.cpp到TDecCu.cpp在於項目。

.H只包含聲明同時的.cpp constains實現,當一個項目被編譯,編譯器將嘗試從項目文件或項目引用的某些lib文件中找到所需的所有實現。

如果您在文件中只包含.h,編譯器無法找到它的實現。

+0

這完全違背了頭文件的目的,不是嗎?無論如何我都修好了:鏈接器沒有在正確的目錄中查找。 – user1554056 2012-07-26 13:45:59

相關問題