三、在 Unix/Linux 的系統裡,libfoo.a 與 libfoo.so 之類的程式庫(libraries)有何不同? 並依生成方式、使用方式、使用時機、對系統的影響等面向說明。 (20 分) (請接第四頁)
詳解 (共 2 筆)
詳解
生成方式:
libfoo.a是一個靜態程式庫,而libfoo.so是一個動態程式庫。靜態程式庫在編譯時被綁定(link)到執行檔案中,動態程式庫則是在運行時被載入到記憶體中。
使用方式:
靜態程式庫的使用方式比較簡單,只需要在編譯時把它們和執行檔案一起編譯即可。動態程式庫則需要在執行時載入,通常是使用動態載入(dynamic linking)的方式載入,例如在C語言中使用dlopen()和dlsym()函式庫。
使用時機:
靜態程式庫的使用時機通常是在編譯時期已知需要的程式庫,並把它們與執行檔案一起編譯。動態程式庫則更適合在執行時期需要根據需要動態載入的程式庫。
對系統的影響:
靜態程式庫會增加執行檔案的大小,因為程式庫被編譯進去了。而動態程式庫則不會增加執行檔案的大小,但需要在執行時期載入程式庫,可能會影響系統的效能。
總結來說,靜態程式庫在編譯時期被綁定到執行檔案中,使用方便,但會增加執行檔案的大小。動態程式庫則更適合在執行時期需要根據需要動態載入的程式庫,不會增加執行檔案的大小,但可能會影響系統效能。在實際應用中,需要根據具體情況選擇適合的程式庫。
詳解
總結
| 比較維度 | 靜態程式庫(libfoo.a) | 動態程式庫(libfoo.so) |
|---|---|---|
| 生成方式 | 使用 ar 打包目標文件 | 使用 gcc -shared 生成 .so 文件 |
| 使用方式 | 編譯時鏈接,代碼被包含在可執行文件中 | 編譯時聲明依賴,運行時加載 |
| 使用時機 | 需要獨立可執行文件或無法使用動態鏈接時 | 需要減少可執行文件大小,共享庫代碼,或需要動態加載時 |
| 對系統的影響 | 可執行文件較大,內存和磁碟空間使用較多,更新需重新編譯 | 可執行文件較小,共享內存和磁碟空間,更新不需重新編譯,但啟動時稍有開銷 |
這些特點使得靜態程式庫和動態程式庫各有其適用的情景,選擇哪種類型的程式庫應根據具體的應用需求來決定。