我正在學習C++,並且遇到了鏈接器明顯使用的* .lib文件。我不得不爲OpenGL設置一些額外的依賴關係。Visual Studio:什麼是lib文件(用於)?
- 這個上下文中的庫文件到底用了什麼?
- 它們的內容是什麼?
- 它們是如何產生的?
- 還有什麼值得了解的嗎?
或者他們僅僅是可重定位的對象代碼類似於* .obj文件嗎?
我正在學習C++,並且遇到了鏈接器明顯使用的* .lib文件。我不得不爲OpenGL設置一些額外的依賴關係。Visual Studio:什麼是lib文件(用於)?
或者他們僅僅是可重定位的對象代碼類似於* .obj文件嗎?
簡而言之,yes - .lib文件只是.obj文件的集合。
在Windows上有一個輕微的複雜情況,你可以有兩類lib文件。
靜態庫文件基本上包含一個.obj集合,並與您的程序鏈接以提供.lib中的所有功能。它們主要是一種方便,可以讓您儘可能多地處理文件。
還有一些存根.lib,它們只提供了包含在.dll文件中的函數的定義。 在編譯時使用.lib文件告訴編譯器該函數期望什麼,但代碼是在運行時從dll加載的。
.lib文件是「庫」,包含編譯代碼所謂的「集合」。因此,這是一種提供軟件組件的方式,例如,不會泄露內部源代碼。它們可以像可執行文件一樣生成爲「構建」的「輸出」。
具體內容取決於您的平臺/開發環境,但它們將包含鏈接程序的符號,用於例如由「連接」功能調用。庫的頭文件。
某些庫是「動態的」(Windows上的.DLL),這意味着函數調用的「掛鉤」是在加載使用庫的可執行文件時設置的,允許在不重建可執行文件的情況下更改庫實現。
最後一件事。你說你正在學習C++,而一個常見的混淆點是,C++編譯器生成的「符號」被「破壞」(例如爲了允許函數重載),並且這種「破壞」在不同的編譯器中不是標準化的,所以圖書館經常使用C作爲圖書館的「API」(就像OpenGL一樣),儘管圖書館可能在C++內部實施。
我希望對.lib文件做些說明。 Happy OpenGL編碼:-)
這個 上下文中的庫文件究竟用於什麼?
它們是編譯和鏈接的代碼就像你的可執行文件。它們被稱爲靜態庫,其他程序可以在編譯時鏈接到它們。在OpenGL的情況下,您鏈接到它們的庫以構建可運行OpenGL代碼的可執行文件。動態庫(DLL)是可執行文件鏈接的另一類庫,除了在運行時。
它們的內容是什麼?
靜態庫包含鏈接的目標代碼就像一個EXE。 * .obj文件是編譯器爲鏈接器生成的目標代碼。
它們是如何產生的?
當編譯器創建目標文件時,它將工作傳遞給鏈接器。您可以在開發環境中創建它們,就像可執行文件一樣。
還有什麼值得知道的 ?
是的,它們在任何地方都可以使用,所以它不會傷害到習慣它們。
我覺得這第二類.libs被稱爲'導入庫' – 2012-03-19 22:31:32
我想知道'.lib'文件的重點是什麼。它們似乎是多餘的,導出的函數大概已經被應用程序調用的頭文件中。他們從來不需要動態鏈接,gcc不需要它們,mingw不需要它們,clang不需要它們,所以爲什麼VS需要它們?幕後發生了什麼? – Thomas 2014-10-30 07:22:08
@thomas yes鏈接器應該能夠解析dll並獲取所有信息。我不知道爲什麼Windows不能這樣做 - 它可能是dll格式中的遺留問題。 – 2014-10-30 22:11:27