2014-03-14 75 views
0

我在一個解決方案中有兩個項目。當我嘗試訪問另一個項目的功能時,我得到error LNK2001: unresolved external symbol。但鏈接錯誤只在函數在頭文件中聲明但在相應的cpp文件中定義時纔會發生。如果函數在頭文件中定義,則不會發生錯誤。也從同一個項目調用函數不會給出任何錯誤。只從另一個鏈接錯誤調用結果。鏈接錯誤無法正確鏈接頭文件到cpp文件

編輯:我正在使用visual studio 2010.我不知道是否值得一提的是被調用的函數是在一個項目中輸出一個lib文件,並調用該函數輸出一個exe文件。

+0

您正在使用哪個IDE? 「項目」和「解決方案」是IDE特定的術語。也許把它添加爲標籤? – Svaberg

+0

編輯我的問題。謝謝。 – Tahlil

+0

只需在您的項目中添加帶定義的cpp文件 –

回答

2

如果您在頭文件中定義函數,編譯器將在生成.exe項目並將函數代碼的副本直接編譯到.exe項目時看到函數實現。在構建過程中,當鏈接器輪到時,沒有任何東西丟失,所以鏈接器很快樂,並且不會收到錯誤消息。

如果您在.cpp文件中定義函數,編譯器將不會看到函數實現。因此,它將提供一個對構建期間鏈接器輪換時需要解決的函數(即外部符號)的引用。要使鏈接器「看到」外部符號,您需要將.exe項目與.lib項目鏈接起來。建立鏈接依賴關係後,鏈接器將能夠找到外部符號並解析對由編譯器生成的函數的引用。由於您有一個.lib項目,它是一個靜態庫項目,鏈接器通過從.lib文件中獲取函數的代碼並將代碼的副本放入.exe文件來解析該符號。

這麼多理論。現在,讓您的.exe項目鏈接對你的.lib項目可能是最簡單的辦法就是通過增加一個參考:

  • 在.exe項目的設置,選擇名爲「公共屬性」一節在部分的頂部名單。
  • 您現在應該看到.exe項目具有的引用列表。該列表可能是空的。
  • 單擊對話框底部的「添加新引用」按鈕並添加.lib項目作爲參考
  • 當您在引用列表中選擇新引用時,您將看到該引用的一組屬性。確保名爲「鏈接庫依賴關係」的屬性設置爲true。這將導致.lib項目在生成.exe項目時作爲鏈接器的輸入自動添加。

如果您構建.exe項目,現在鏈接器錯誤將消失。

順便提一下,通過添加項目引用,您還告訴Visual Studio如果構建整個解決方案,則按正確順序構建兩個項目:首先是.lib項目,然後是.exe項目。

+0

關於時間:D非常感謝。它的工作原理:D – Tahlil

0

它是鏈接器解析未知符號的作用。

因此,如果謨A使用在CPP文件中定義從謨B分析方法,你需要連接一個反對B.

如前所述,這將是罰款,有關於這兩個項目,IDE的更多信息(視覺? )...

+0

我正在使用visual studio 2010.謝謝。 – Tahlil