2012-07-08 50 views

回答

1

此設置在VS2010中摸索了一下,它在以前的版本中更加清晰。您在屏幕截圖中顯示的設置出現在Tools + Options中。其中顯示了核心意圖,它們包含由Visual Studio及其組件確定的目錄。 CRT,MFC,ATL和SDK庫的位置。

鏈接器+輸入+附加依賴關係設置非常重要,您可以準確地說出鏈接器鏈接的.lib文件。您可以指定.lib文件的路徑並完成。但是,您僅指定.lib文件的名稱並不罕見,然後編輯其他庫目錄以告知鏈接程序在哪裏搜索這些.lib文件。如果Boost的安裝位置不總是相同的,或者您想從一個Boost版本切換到另一個版本,那麼這很方便。

因此,在總結:

  • 鏈接器+輸入+附加依賴:添加您需要鏈接
  • 鏈接器+通用+附加庫目錄的.lib文件:如果你沒有指定只使用的.libs的路徑
  • VC++目錄:不要惹它

請注意,最後兩個b ullets僅指定目錄,而非鏈接程序應鏈接的.lib文件。第一個項目符號指定實際的.lib文件。啓動MSVC程序員總是困惑的是,鏈接器奇蹟般地知道如何找到重要的.lib文件,而無需在「附加相關性」設置中明確指定它們。

這不幸是Visual C++的非可視部分。項目可以通過兩種不同的方式指定.lib文件,鏈接器應該鏈接而不使用該設置。第一個是您選擇用於啓動項目的項目模板。它使用項目屬性頁,指定項目的默認設置的文件。您可以通過View = Other Windows + Property Manager查看它們。一個重要的是「Core Windows Libraries」,它設置Additional Dependencies設置來鏈接基本的Windows .lib文件,這些文件就像kernel32.lib和user32.lib一樣。這些設置是由您的項目「繼承」的。否則,如果您遇到過,請給「NoInherit」賦予意義。

第二個重要的方法是#pragma註釋指令。它在源代碼中使用,它注入一個鏈接器指令。 「lib」變體很重要,它告訴鏈接器鏈接.lib文件。 此外,與您在鏈接器的「附加依賴項」設置中明確指定的內容相對應。 vc/atlmfc/include/afx.h就是一個很好的例子。搜索「#pragma comment」。請注意根據編譯器特定設置選擇適當的mfc .lib文件的宏湯。 MFC需要鏈接的一堆額外的Windows .lib文件。

C++構建模型充滿了曲折小段的迷宮。 IDE試圖讓你陷入成功之巔,但是在這個過程中隱藏了重要的一步,以達到理解的下一個層次。在C#中沒有什麼不同,因爲知道如何使Reverse()擴展方法不消耗O(n)存儲需要挖入。

+0

VC++目錄下的庫不會鏈接到輸出中?那他們用了什麼? – 2012-07-08 21:06:35

+1

不,該設置僅指定*目錄*,不指定庫。如果鏈接器僅具有文件名而不是.lib的完整路徑名,鏈接器將搜索.lib的目錄。查看許多庫的頭文件中使用的#pragma註釋指令,告訴鏈接器某個.lib是必需的。這就是鏈接器知道鏈接的方式,例如,libcmt.lib鏈接CRT。您需要調整C#的思路,因爲涉及多個工具,因此C++涉及更多。 – 2012-07-08 21:10:20

+0

增加了另一節討論.lib文件。 – 2012-07-08 21:58:30

0

大多數(不是全部)庫設有兩組文件:

  • 頭文件在源代碼中包含(#include)目前正使用的庫,提供函數,類常量或任何其他聲明可能需要

  • 庫文件是包含庫的代碼的二進制代碼。鏈接器在組裝最終可執行文件時使用這些設置

相關問題