首頁  >  問答  >  主體

c++ - 谁能简单明白易懂说明一下.a .o .so 这几个文件到底啥区别

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

  1. .a

  2. .o

  3. .so

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

高洛峰高洛峰2765 天前719

全部回覆(4)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:54:39

    1、是靜態函式庫類似NT下的lib
    2、是物件檔。就是編譯成程式時的半成品。
    3.是動態函式庫類似NT下的DLL

    回覆
    0
  • PHP中文网

    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

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:54:39

    簡單的來說一下

    .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

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

    回覆
    0
  • 阿神

    阿神2017-04-17 13:54:39

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

    回覆
    0
  • 取消回覆