c++ - 谁能简单明白易懂说明一下.a .o .so 这几个文件到底啥区别
高洛峰
高洛峰 2017-04-17 13:52:39
0
4
743

谁能简单明白易懂说明一下

  1. .a

  2. .o

  3. .so

这几種文件到底啥区别 与 联系

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(4)
伊谢尔伦

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

Peter_Zhu

簡單的來說一下

.o檔

.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好,現在

文件出來了。它就是C/C++編譯的產物,因為C/C++編譯的單元編譯。每一個.c/.cpp檔就是一個編譯單元,把所有單元都編譯好之後,再連接成一個完成的程式。

.a檔

.a.o文件實質上就是.o文件打了個包。一般把它叫做靜態庫檔。它在使用的時候,效果和使用

文件是一樣的。

.so檔

.so.o文件就不一樣了,它不是簡單的
文件打了一個包,它是一個ELF格式的文件,也就是linux的可執行文件。 .so

檔案可以用於多個進程的共享使用(位置無關的才行),所以又叫共享庫檔案。程式在使用它的時候,會在運行時把它映射到自己進程空間的某處,其不在使用它的程式中。
阿神

.o 是一個最小的編譯單元
.a 就是一組 .o檔打包了
.so 除了沒有 main 函數,和一個可執行程類似了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板