Linux應用開發--靜態函式庫和動態函式庫
什麼叫庫?就是一些函式經過一定的操作生成的可執行的二進位制檔案,能夠被外部呼叫使用封裝的函式。
Linux應用程式所使用的主要函式庫均存放於/lib和/usr/lib目錄下,其中以*.so方式命名的是動態函式庫,以*.a命令的是靜態函式庫,linux下進行連結時預設使用動態函式庫,如果想要使用靜態函式庫時使用-static編譯選項即可,比如:gcc -static hello.c -o hello
一、靜態函式庫和動態函式庫
1、在使用靜態函式庫時,我們需要的庫都將會編譯到程式當中,程式執行時就不再需要連結外部的函式庫了。在應用程式中,靜態函式庫有多份函式庫的拷貝,意思就是每使用一個靜態函式庫裡的函式呼叫都會生成一個函式庫的副本,這樣就導致應用程式比較大,比較浪費空間。
2、動態函式庫,又叫共享庫,它使得可執行檔案中不再需要包含公用的函式庫,而只需在所有程序都可以引用的儲存區中儲存這種函式庫的一個副本並沒有編譯進入程式本身,所以和靜態函式庫不一樣,程式中只有一份函式庫的拷貝,減少了程式空間,尤其是在一些通用的功能使用中,比如讀寫檔案,但是增加了執行時間,增加的時間體現在第一次使用函式庫時的開銷。
二、函式庫的製作
1、製作靜態函式庫
靜態函式庫的製作分為三步:
gcc -c Libname.c -o Libname.o
ar cqs libLibname.a Libname.o
將製作好的libLibname.a複製到/usr/lib中
2、製作動態連結庫
gcc -c Libname.c -o Libname.o
gcc -shared -fPIC Libname.o -o Libname.so
將製作好的函式庫複製到/usr/lib中
特別說明:-fPIC使輸出的物件模組是按照可重定位地址方式生成的。
-shared指明產生動態連結庫
3、如何使用:
gcc編譯器在連結時預設只會連結C函式庫,要想使用其他函式庫時需要加入編譯選項-l顯示指明某個庫需要連結
如:gcc thread.c -o thread -lpthread,執行緒函式需要連結執行緒庫pthread