2010-02-25 984 views
29

我想靜態編譯的東西,我試圖得到所有這些依賴關係的處理。我知道.dll文件適用於最終輸出需要的動態鏈接依賴關係,但.a和.lib文件是什麼,以及什麼時候需要這些文件?.lib和.a文件有什麼區別?

回答

28

.a是代碼存檔:已編譯但未鏈接。在程序的最終鏈接步驟中,您可以靜態鏈接它。

.lib可以與.a相同,也可以是一個神奇的所謂「導入庫」:一個很薄的佔位符,它使您在運行時需要一個.dll文件。

+0

我正在用.a OpenSSL庫編譯QT框架,但不知何故,QT生成的最終可執行文件仍需要外部OpenSSL dll才能運行。你有什麼想法,因爲我正在使用.a庫,情況如何? – Nantucket 2010-02-26 00:09:00

+0

如何編譯OpenSSL .a的內容? 你如何鏈接你的最終可執行文件? – crazyscot 2010-02-26 08:52:54

+0

我不確定「在運行時需要.dll」。如果您的項目使用.lib靜態庫(除非存在未正確識別的.dll依賴項),則不需要.dll。 – ha9u63ar 2014-08-26 07:10:52

4

通常,.A是Linux下的靜態庫,而的.lib是相同的,但在Windows上。但當然這只是一個慣例。

19

在Unix系統上,您有.a文件。這些是對象文件的簡單歸檔文件(.o)。

在Windows上,有.lib文件,這些文件是完全相同的,但是對於Windows而不是Unix。

一個額外的細節是,爲了鏈接一些代碼與DLL(在Windows上),你必須鏈接到一個.lib文件,其中包含調用該DLL的簡單包裝。在Unix系統上,傳統上不需要這樣的包裝(鏈接器足夠聰明,可以隨時生成它們)。

+0

謝謝你的回答,發現我試圖用Windows標誌在某處編譯! :) – 2012-12-04 21:56:37

+0

在windows和unix中創建的.a有沒有區別? – samnaction 2017-01-17 12:15:56

5

我在這裏沒有看到的東西還有一個令人驚訝的事實,即至少在某些時候,.a文件和.lib文件實際上是,它們是。儘管我在mingw網站上找不到任何內容,但我注意到,當試圖將MS Visual C++的64位編譯器cl.exe鏈接到使用mingw-w64 g ++編譯器生成的.dll文件中時,它很高興地接受命令行

cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a 

所得.exe文件,因爲我把相應的.dll文件的副本在當前目錄正確地儘快跑。 (它確實咕噥了警告。 「命令行警告D9024:無法識別的源文件類型 '路徑\到\ LIB \ GMP-6.0.0 \ LIB \ libgmp.dll.a',對象文件假定」)

進一步的證據是Linux file命令爲我試過的每個擴展名(.lib或.a)的幾個文件報告「current ar archive」。

相關問題