建構系統、函式庫與相依性
靜態函式庫(.a 封存檔)
靜態函式庫是兩種函式庫裡較單純的一種:一批已編譯的程式碼,於你建構程式時被直接複製進去,於是完成的可執行檔自帶一份副本,執行時不需任何額外東西。可以想成把參考書裡你需要的幾頁影印下來、釘進你自己的報告——一旦做完,你就能把原書丟掉,而你的報告已然完整。
在實體上,Unix 上的靜態函式庫是一個封存檔,通常命名像 libfoo.a,它差不多就是把一堆目的檔(.o 檔)打包在一起,常用 ar 工具製作。當你把程式連結到它時,連結器伸進這個封存檔,正好取出含有你程式實際用到之函式的那些目的檔,把它們的機器碼複製進你最終的可執行檔。在那之後,.a 檔於執行期就不再需要;程式碼已被烤進去了。
為什麼重要:靜態連結造出一個自足的可執行檔,你能把它複製到另一台機器執行,不必擔心缺少函式庫,這對簡單部署很棒。代價是體積與更新:每個靜態連結某函式庫的程式都自帶一份那段程式碼的副本(若許多程式都這麼做,會浪費磁碟與記憶體),而且若函式庫修了一個臭蟲,你得重建每一個程式才能取得修正——舊副本仍凍結在每個二進位檔裡。
製作一個靜態函式庫並連結進來: gcc -c util.c -o util.o ar rcs libutil.a util.o # 把 .o 檔打包成封存檔 gcc main.c -L. -lutil # 把需要的程式碼複製進二進位檔 即使 libutil.a 被刪掉,產生的程式仍能執行。
.a 封存檔是一束目的檔;連結器把需要的那些複製進可執行檔。
靜態連結在建構時把程式碼複製進去,因此日後對函式庫的修正不會傳到已經建好的程式——它們會把舊程式碼凍在裡面,直到你重新連結它們為止。
又稱
另見