2012-07-18 52 views
0

據我所知,.lib文件是某種編譯文件,當然dll文件中也包含了所有的函數。爲什麼我不能只使用.lib文件或僅使用.dll文件?爲什麼說明書讓我得到所有三個?爲什麼我需要glut.h,glut32.lib,glut32.dll ALL才能編譯openGL程序?

順便說一句,是openGL的文件不能自由反正我們有一個「freeGLut」?

+0

說明是我從網站上下載它們的 – quantum231 2012-07-18 23:58:53

+0

還有一件事,就是編寫OpenGL程序來學習它,單獨使用C語言的特性還是會使用C++的特性? – quantum231 2012-07-19 00:00:03

+1

這個問題太混亂,難以真正回答。你問C/C++鏈接如何工作? C/C++頭文件的工作原理DLL如何工作? OpenGL如何工作? GLUT是什麼,它是如何不是OpenGL ***?因爲這個問題似乎顯示出對所有*這些知識的嚴重缺乏。 – 2012-07-19 00:39:49

回答

4

據我所知,.lib文件是某種編譯文件,當然dll文件也包含了它的所有功能。

不,這不是那麼簡單。

DLL是可執行二進制文件,減去啓動入口點。 DLL導出一些符號,但這些符號是無特徵的,只能在地址空間中定位。編譯器不能從標準DLL(或SO)中推導出每個符號具有哪些簽名。爲此,需要通過其他來源以某種方式告知簽名。這是頭文件(.h)。

然而要被實際有用的,該DLL必須被加載到在執行的過程。爲此,可執行文件需要增加額外的信息,即加載哪些DLL。在Windows下,這是使用一個存根庫(.lib)完成的,該庫僅傳輸該DLL導入信息。在其他操作系統上,通過將鏈接器指向該鏈接器來鏈接「DLL」。

爲什麼我不能只處理.lib文件或只是.dll文件?

因爲.lib不包含實際的代碼,但只包含信息,要使用某個DLL。而且由於Microsoft工具無法從目標DLL中提取動態鏈接信息。

爲什麼說明書告訴我要得到它們三個?

,因爲每個文件都有特定的功能,你需要所有他們三人

  • 得到函數簽名(.H)
  • 告訴你的可執行文件加載DLL某(.LIB )
  • 並獲得一個.dll

順便說一句的形式實際庫,是openGL的文件反正我們有一個「freeGLut」不是免費的嗎?

GLUT不是OpenGL的一部分。這是一個獨立開發的圖書館。此外,OpenGL本身只是一個規範,並沒有「的」OpenGL資源;只有特定的實現,其中一些是免費的。

4
  • glut32.h是在編譯階段
  • glut32.lib所使用的報頭文件被鏈接器解析由glut32庫提供的功能和/或對象引用的庫文件。與DLL一起使用時,.lib文件通常稱爲「導入庫」,而不是實際的代碼,它具有鏈接器用來使可執行文件隱式引用DLL中的函數的信息,所以運行時加載器也將加載DLL當可執行文件在運行時加載時。一些工具鏈提供了一個工具(通常稱爲implib),它可以使用DLL作爲輸入生成導入庫。
  • glut32.dll是在運行時用於在可執行時間提供函數和對象的動態庫。

某些工具(例如GCC工具鏈)可以直接使用DLL代替.lib文件 - 實際上提供了自己的implib功能。我不確定微軟爲什麼不支持他們的工具。

3

GLUT是一個可選組件。如果你的程序不使用它,你不需要它。但是,如果你使用它,你需要glut.h因爲你的程序#include的IT,你需要glut32.lib,因爲它是鏈接器用來建立你的可執行文件與DLL的關係import library。當您編譯或鏈接程序(因爲導入庫用於這一目的)你不需要glut32.dll,但你需要它時,你運行你的程序,因爲它包含了您的程序調用實際GLUT功能。

Freeglut是原始GLUT的一個開源克隆,因爲原來的GLUT是外的日期和它的許可證不允許別人做出改變,以改善它。

相關問題