2010-11-08 64 views
5

我們有一個使用VS2008和boost 1_42的大型項目。我正在嘗試升級到VS2010並提升1_44。我安裝了VS2010並升級1_44並轉換了項目。現在我想建立,一切編譯,但無法連接時:VisualStudio爲什麼尋找這個lib文件? LNK1104錯誤

LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-1_42.lib'

我已經改變了包括和lib目錄指向新的動力1_44文件,我已改名爲舊升壓1_42目錄。

爲什麼當鏈接器只使用1_44頭文件時仍然在尋找vc90-1_42文件?有沒有一種方法可以確定鏈接器想要這個文件的原因?鏈接器顯然認爲它需要該文件,但爲什麼?

我已經清理了該項目,並且正在重新構建以確保任何舊構建文件都被刪除。

+0

好的,我發現我的問題是什麼,但我仍然想回答「我怎麼知道鏈接器想要這個文件?」。我的項目依賴於我們的一個使用boost 1_42構建的lib文件。我用boost 1_44重新編譯了lib文件,並且主項目上的鏈接器錯誤消失了。有沒有我可以用來查看這種情況的日誌或實用程序? – JPhi1618 2010-11-08 17:05:29

+0

我很確定沒有。這種信息(「需要鏈接到some_lib」)可能深藏在生成的obj和lib文件中。 – 2010-11-09 07:00:04

回答

3

隨着更改lib目錄,您需要更改boost庫的名稱。這在鏈接器中項目設置的輸入部分。

您添加的評論清楚地表明,對Boost 1.42庫的依賴性由另一個未被重建的庫間接創建。

爲此,您基本上有兩種選擇:將該庫作爲項目添加到您的主解決方案中,並確保它具有足夠的依賴性信息,以便在升級Boost時重新構建它,或使用編譯器/Zl當你建立你的圖書館時切換。這告訴編譯器你正在建立一個庫,所以你想而不是想嵌入像這樣的庫依賴關係。

+2

Boost使用自動鏈接,因此我不會手動列出鏈接器|輸入部分中的所有文件。 – JPhi1618 2010-11-08 17:02:06

0

升壓使用

#pragma comment(lib) 

命令通知庫的鏈接器需要與鏈接。這不是一個錯誤。如果Boost說你需要它,那很可能你會這樣做。

+0

我在說這是一個錯誤,因爲沒有理由提升1_44需要提升1_42 lib文件。 – JPhi1618 2010-11-08 17:01:20

+0

當時Boost可能存在一個bug,但我對此表示懷疑。 – 2010-11-08 17:18:06

+0

我相信傑瑞棺材的權利。你可能有一些依賴於一些其他庫(自制或不自制),這取決於boost 1.42。因此,您遇到了自動鏈接問題。 – 2010-11-08 17:25:15

5

我也碰到過這個問題幾次。它通常是一些舊的臨時文件,但就像你的情況一樣,清理並不總是馬上執行。你的項目是否包含可能用1.42構建的靜態庫?

有些事情,你可以嘗試這可能會或可能不會在追蹤您的問題有所幫助: 重命名舊升壓目錄回到它原來的名字

  • 清潔液
  • 在C/C++ - >指揮設備 - >附加選項添加 「/ showIncludes」
  • 在連接器 - >命令設備 - >附加選項添加 「/詳細:LIB」
  • 重建所有

然後,當你建立你將能夠看到在哪一點包括1.42頭等輸出窗口中。不知怎的,這樣做幫助我追蹤問題出在哪裏。

0

關於如何找出鏈接器需要此文件的原因?

有些程序會通過你的應用程序和dll/libs並報告清單的內容以及它們依賴的二進制報告。然後,您可以掃描報告中包含的意外庫。我們主要使用它來查找包括VC運行時的以前版本的庫。

雖然沒有用過我們在5年左右的時間,但現在如果我只記得應用程序的名字!

DependancyWalker(depends.exe)將允許您查看dll/exe的依賴關係,但不是靜態庫。

您可以打開每個二進制文件作爲MSVS中的「文件」,並手動查看清單內容,但是對此進行映像將會有點痛苦。我沒有用靜態庫來嘗試這個。

相關問題