2010-01-26 41 views
4

Windows上的*.a*.dll有什麼不同?根據我的理解,可以將所有* .o文件打包成*.a,這是其他應用程序可以在Linux上使用的可分發文件。Windows上的* .a和* .dll之間的區別

但是*.a*.dll有什麼區別?它們可以互換嗎?如果我的應用程序需要鏈接到*.a,我可以將它鏈接到*.dll作爲替代嗎?

回答

4

另外:除非使用基於Linux的工具鏈,否則沒有定義* .a格式的純Windows開發工具。你大概是指Windows中的靜態庫,也就是.lib。

DLL與Unix上的共享庫(* .so)等效,不,如果鏈接程序希望鏈接到靜態庫,通常無法鏈接到共享庫/ dll。

+0

共享對象庫在Linux下有'* .so'擴展名,也許值得告訴,即使這不是真的突發新聞:-P – jdehaan 2010-01-26 10:37:56

+0

但是,您可以從dll中提取靜態庫,然後鏈接到提取的庫。 – erikkallen 2010-01-26 10:44:42

0

在使用gcc的Linux下,您將看到兩種文件檔案*.a(用於提供一組靜態鏈接的函數)和*.so(所謂的共享對象庫(用於動態鏈接))。在大多數編譯器的窗口下,它們的等效項目是*.lib*.dll。因此*.a*.dll根本不可互換。此外,你有Windows下的困境,*.lib可用於靜態和動態鏈接(與固定地址)。另一種方法是動態地與GetProcAddress進行動態綁定,但是如果你想讓這些dll適用於不同版本,那麼這可能是你需要創建一個包裝器的開銷。

您可能會認識到它們大小的靜態庫,與用於動態鏈接的庫相比,它們相當龐大。在我的項目中,我經常使用GetProcAddress,因爲我喜歡在沒有鏈接所有內容的情況下直接插入舊版應用程序的全新DLL。

+0

沒有理由靜態庫必須大於動態庫。使用靜態庫的*應用*通常會更大。 – 2010-01-26 10:50:27

+0

我的意思是dll鏈接的lib文件僅包含函數的地址,但靜態lib包含所有的東西。可能並不清楚我是在比較lib文件而不是將dll與相應的lib進行比較。問候,Jaap – jdehaan 2010-01-26 12:29:00

1

看到* .a是Linux靜態庫,它們與windows.dll(動態鏈接庫)完全不可互換,因爲它們具有完全不同的格式。如果您的應用程序需要鏈接到您創建的.a,則需要將生成您的linux靜態庫的源代碼(如果可能)重新編譯爲Windows靜態庫(.lib),然後根據該代碼編譯您的代碼。

相關問題