谁能简单明白易懂说明一下
.a
.o
.so
这几種文件到底啥区别 与 联系
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
1、是靜態函式庫類似NT下的lib2、是物件檔。就是編譯成程式時的半成品。 3.是動態函式庫類似NT下的DLL
在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.oar -t libname.a 可見name.o
簡單的來說一下
.o檔案是原始碼編譯出的二進位。 你先得了解從原始碼到執行檔的過程。以一個簡單的add函數原始檔為例。
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
.i
gcc -E add.c -o add.i
gcc -S add.i -o add.s
gcc -c add.s -o add.o
.o好,現在
.a.o文件實質上就是.o文件打了個包。一般把它叫做靜態庫檔。它在使用的時候,效果和使用
.so.o文件就不一樣了,它不是簡單的文件打了一個包,它是一個ELF格式的文件,也就是linux的可執行文件。 .so
.o 是一個最小的編譯單元 .a 就是一組 .o檔打包了.so 除了沒有 main 函數,和一個可執行程類似了。
1、是靜態函式庫類似NT下的lib
2、是物件檔。就是編譯成程式時的半成品。
3.是動態函式庫類似NT下的DLL
在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
簡單的來說一下
.o檔
.o
檔案是原始碼編譯出的二進位。你先得了解從原始碼到執行檔的過程。以一個簡單的
add
函數原始檔為例。先預處理為
.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
.o 是一個最小的編譯單元
.a 就是一組 .o檔打包了
.so 除了沒有 main 函數,和一個可執行程類似了。