2016-01-05 58 views
5

有靜態庫,然後有共享庫。 如果需要的話,難道只有共享的文件可以靜態鏈接嗎?爲什麼我們在C/C++中有兩種類型的庫?

-fPIC編譯一次,沒有一次看起來很浪費。 我不知道很多程序集,但不應該有可能將重新編譯代碼轉換爲比重新編譯所有內容更快的靜態代碼數量級?

+0

此答案提到,建議編譯兩次以避免靜態庫的PIC開銷:http://stackoverflow.com/questions/4863791/creating-both-static-and-shared-c-libraries – PSkocik

+2

庫的風味是操作系統支持的二進制格式的屬性。 C和C++都不瞭解它們,甚至不瞭解庫本身。 –

+0

沒有語言的C/C++。問題不是特定於PL。 – Olaf

回答

6

這部分是歷史問題。一旦只有靜態庫。他們靜態鏈接到系統編譯的每個二進制文件。然而,這代表了維護夢魘以及其他方面的問題,要求所有使用的軟件包在庫修補或更改時重新編譯。

然後共享庫來解決這些問題。現在對於你的問題,首先在靜態鏈接庫中有一些重要的優化,它不可能在動態鏈接庫上執行,因此即使將動態庫轉換爲靜態鏈接庫,它也可能效率低於代碼靜態編譯在第一位。其次,大多數現代系統無論如何都只使用共享庫,所以沒有太多的問題,事情只被編譯一次,就像共享庫一樣。

作爲一個微不足道的,但仍然相關,你可能會考慮prelinking。這個步驟可以消除一些啓動開銷(儘管仍然不一定達到與靜態鏈接相同的性能),並允許在庫中動態鏈接的軟件更快地啓動。

+0

謝謝。我在Linux上使用prelink。不過,我很好奇,是否可以靜態鏈接一個靜態庫。我想至少在理論上應該是因爲PIC目標文件鏈接的很好。 – PSkocik

+1

「然後共享庫解決了這些問題。」 ...並創建數百個... –

+0

@PSkocik是的,有可能http://statifier.sourceforge.net/和http://magicermine.com/這樣做,但要注意它們生成的二進制文件非常非常大,大大慢於動態或正常的靜態,往往片狀或不可靠 – Vality

1

雖然從理論上講,當然可以將後處理動態庫轉換爲靜態庫,但這樣的任務的難度 - 特別是做得很好 - 可能與從頭開始編譯相當。通過後處理獲得相同的結果,比如執行一次從頭開始的靜態構建,可能比再次構建更困難,再加上任何工具都會帶來自己的維護負擔。爲什麼這樣做,當已經有一個完美的方法來實現相同的目標?

此外,建立靜態庫和共享庫絕不是必需的。即使你想這樣做,這樣做的增量成本也是(應該是)整個開發時間的一小部分。

0

當您希望可執行文件不依賴於某個庫時,您將使用靜態庫。基本上,該庫在可執行文件中「發貨」。

當然,這是非常情景化的,因爲大多數時候共享庫都是要走的路。

相關問題