PHP中文网2017-04-17 13:54:39
在Linux上建立靜態函式庫.a和動態函式庫.so
我們通常把一些公用函數製作成函數庫,供其它程式使用.
函數庫分為靜態庫和共享庫兩種:
1.靜態函數庫
這類庫的名字一般是libxxx.a.
利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標程式碼中.
優點就顯而易見了,即編譯後的執行程式不需要外部的函數庫支援,因為所有使用的函數都已經被編譯進去了.
當然這也會成為缺點,如果靜態函數庫改變了,那麼你的程式必須重新編譯.
例如PHP的configure參數--enable-mbstring=static(預設),
產生的mbstring.a被靜態連結到二進位程式php,php-fpm,php-cgi,libphp.so中.
2.共享函式庫
這類函式庫的名字一般是libxxx.so.
相對於靜態函式庫,共享函式庫在編譯的時候並沒有被編譯進目標碼中.
當程式執行到相關函式時才呼叫共享函數庫裡對應的函數,因此共享函數庫所產生的可執行檔比較小.
由於共享函數庫沒有被整合進你的程序,而是在程序運行時動態地申請並調用,所以程式的運作環境中必須提供對應的函式庫.
共享函式庫的改變並不影響你的程式,所以共用函式庫的升級比較方便.
例如PHP的configure參數--enable-mbstring=shared ,產生的mbstring.so就是共享函式庫.
另外用phpize產生PECL擴充函式庫的configure檔,然後make編譯,產生的也是共用函式庫.
--enable-static 產生靜態庫a檔案
--enable-shared 產生共享庫so檔案
用ar打包.o檔案(obj物件檔案,目標檔案)產生.a共用函式庫:
ar -r libname.a name.o
ar -t libname.a 可見name.o
天蓬老师2017-04-17 13:54:39
簡單的來說一下
.o
檔案是原始碼編譯出的二進位。
你先得了解從原始碼到執行檔的過程。以一個簡單的add
函數原始檔為例。
int add(int a,int b)
{
return a+b;
}
先預處理為.i
檔案gcc -E add.c -o add.i
再編譯為彙編檔案gcc -S add.i -o add.s
再彙編為二元的.o檔案gcc -c add.s -o add.o
.o
好,現在
.a
.o
文件實質上就是.o
文件打了個包。一般把它叫做靜態庫檔。它在使用的時候,效果和使用
.so
.o
文件就不一樣了,它不是簡單的
文件打了一個包,它是一個ELF格式的文件,也就是linux的可執行文件。 .so