多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 關于Linux靜態庫和動態庫的分析

關于Linux靜態庫和動態庫的分析

來源:程序員人生   發布時間:2014-10-06 08:00:01 閱讀次數:2495次

關于Linux靜態庫和動態庫的分析

  • 關于Linux靜態庫和動態庫的分析

    1.什么是庫
    windows平臺和linux平臺下都大量存在著庫。
    本質上來說庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。
    由于windowslinux的本質不同,因此二者庫的二進制是不兼容的。
    本文僅限于介紹linux下的庫。


    2.庫的種類
    linux下的庫有兩種:靜態庫和共享庫(動態庫)。
    二者的不同點在于代碼被載入的時刻不同。
    靜態庫的代碼在編譯過程中已經被載入可執行程序,因此體積較大。
    共享庫的代碼是在可執行程序運行時才載入內存的,在編譯過程中僅簡單的引用,因此代碼體積較小。


    3.庫存在的意義
    庫是別人寫好的現有的,成熟的,可以復用的代碼,你可以使用但要記得遵守許可協議。
    現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。
    共享庫的好處是,不同的應用程序如果調用相同的庫,那么在內存里只需要有一份該共享庫的實例。


    4.庫文件是如何產生的在linux
    靜態庫的后綴是.a,它的產生分兩步
    Step 1. 
    由源文件編譯生成一堆.o每個.o里都包含這個編譯單元的符號表
    Step 2.   ar命令將很多.o轉換成.a,成文靜態庫
            
    動態庫的后綴是.so,它由gcc加特定參數編譯產生。
    例如:
    $ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.


    5.庫文件是如何命名的,有沒有什么規范
    linux下,庫文件一般放在/usr/lib /lib下,
    靜態庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱
    動態庫的名字一般為libxxxx.so.major.minorxxxx是該lib的名稱,major是主版本號, minor是副版本號


    6.如何知道一個可執行程序依賴哪些庫
    ldd
    命令可以查看一個可執行程序依賴的共享庫,
    例如# ldd /bin/lnlibc.so.6
    => /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
    => /lib/ld- linux.so.2 (0×40000000)
    可以看到ln命令依賴于libc庫和ld-linux


    7.可執行程序在執行的時候如何定位共享庫文件
    當系統加載可執行代碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑
    此時就需要系統動態載入器(dynamic linker/loader)
    對于elf格式的可執行程序,是由ld-linux.so*來完成的,它先后搜索elf文件的 DT_RPATH環境變量LD_LIBRARY_PATH―/etc/ld.so.cache文件列表―/lib/,/usr/lib目錄找到庫文件后將其載入內存


    8.在新安裝一個庫之后如何讓系統能夠找到他
    如果安裝在/lib或者/usr/lib下,那么ld默認能夠找到,無需其他操作。
    如果安裝在其他目錄,需要將其添加到/etc/ld.so.cache文件中,步驟如下
    1.
    編輯/etc/ld.so.conf文件,加入庫文件所在目錄的路徑
    2.
    運行ldconfig,該命令會重建/etc/ld.so.cache文件


    們通常把一些公用函數制作成函數庫,供其它程序使用。函數庫分為靜態庫和動態庫兩種。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。動態庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。本文主要通過舉例來說明在Linux 中如何創建靜態庫和動態庫,以及使用它們。在創建函數庫前,我們先來準備舉例用的源程序,并將函數庫的源程序編譯成.o文件。

    1步:編輯得到舉例的程序--hello.hhello.cmain.c

    hello.h(見程序1)為該函數庫的頭文件。

    hello.c(見程序2)是函數庫的源程序,其中包含公用函數hello,該函數將在屏幕上輸出"Hello XXX!"

    main.c(見程序3)為測試庫文件的主程序,在主程序中調用了公用函數hello


     

    程序1: hello.h

    #ifndef HELLO_H

    #define HELLO_H

    void hello(const char *name);

    #endif //HELLO_H


     

    程序2: hello.c

    #include <stdio.h>

     

    void hello(const char *name)

    {

           printf("Hello %s! ", name);

    }


    #include "hello.h"

     

    int main()

    {

    hello("everyone");

    return 0;

    }


     

    2步:將hello.c編譯成.o文件;

    無論靜態庫,還是動態庫,都是由.o文件創建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。

    在系統提示符下鍵入以下命令得到hello.o文件。

    # gcc -c hello.c

    我們運行ls命令看看是否生存了hello.o文件。

    # ls

    hello.c hello.h hello.o main.c

    ls命令結果中,我們看到了hello.o文件,本步操作完成。

    下面我們先來看看如何創建靜態庫,以及使用它。


     

    3步:由.o文件創建靜態庫;

    靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。在創建和使用靜態庫時,需要注意這點。創建靜態庫用ar命令。

    在系統提示符下鍵入以下命令將創建靜態庫文件libmyhello.a

    # ar cr libmyhello.a hello.o

    我們同樣運行ls命令查看結果:# ls    ls命令結果中有libmyhello.a

    hello.c hello.h hello.o libmyhello.a main.c


    4步:在程序中使用靜態庫;

    靜態庫制作完了,如何使用它內部的函數呢?只需要在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然后在用gcc命令生成目標文件時指明靜態庫名,gcc將會從靜態庫中將公用函數連接到目標文件中。

    注意,gcc會在靜態庫名前加上前綴lib,然后追加擴展名.a得到的靜態庫文件名來查找靜態庫文件。

    在程序3:main.c中,我們包含了靜態庫的頭文件hello.h,然后在主程序main中直接調用公用函數hello。下面先生成目標程序hello,然后運行hello程序看看結果如何。

    # gcc -o hello main.c -L. -lmyhello

    # ./hello

    Hello everyone!

    我們刪除靜態庫文件試試公用函數hello是否真的連接到目標文件 hello中了。

    # rm libmyhello.a

    rm: remove regular file `libmyhello.a'? y

    # ./hello

    Hello everyone!

    程序照常運行,靜態庫中的公用函數已經連接到目標文件中了。

    我們繼續看看如何在Linux中創建動態庫。我們還是從.o文件開始。


     

    5步:由.o文件創建動態庫文件;

    動態庫文件名命名規范和靜態庫文件名命名規范類似,也是在動態庫名增加前綴lib,但其文件擴展名為.so。例如:我們將創建的動態庫名為myhello,則動態庫文件名就是libmyhello.so。用gcc來創建動態庫。

    在系統提示符下鍵入以下命令得到動態庫文件libmyhello.so

    # gcc -shared -fPIC -o libmyhello.so hello.o

    我們照樣使用ls命令看看動態庫文件是否生成。# ls

    hello.c hello.h hello.o libmyhello.so main.c


     

    6步:在程序中使用動態庫;

    在程序中使用動態庫和使用靜態庫完全一樣,也是在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然后在用gcc命令生成目標文件時指明動態庫名進行編譯。我們先運行gcc命令生成目標文件,再運行它看看結果。

    # gcc -o hello main.c -L.

    生活不易,碼農辛苦
    如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
    程序員人生
    ------分隔線----------------------------
    分享到:
    ------分隔線----------------------------
    關閉
    程序員人生
    主站蜘蛛池模板: 中文一区在线 | 99成人精品 | 亚洲天堂成人在线观看 | 天堂avwww| free×性欧美hd| 免费一级做a爰片久久毛片潮喷 | 武则天免费一级淫片 | 国产理论视频在线观看 | 性欧美乱又伦 | 337p欧洲亚洲大胆艺术 | 国产精品极品美女自在线看免费一区二区 | a毛片免费 | 自拍视频网站 | 国产精品老女人精品视 | 2021天天躁夜夜躁狠狠躁 | 日本特级aⅴ一级毛片 | 欧美综合自拍亚洲综合百度 | 日本一区二区高清免费不卡 | 国产成人久久精品一区二区三区 | 欧美xart系列高清在线视频 | 69xxxx女人免费 | 国产福利不卡视频在免费播放 | 欧美综合视频在线 | 永久免费毛片在线播放 | 亚洲国产精品乱码一区二区三区 | 亚洲视频免费在线播放 | 欧美性色xxxxxbbbbb | 欧美日韩精品免费一区二区三区 | 爱爱小视频免费体验区在线观看 | 18video性欧美19sex高清 | 91国内精品久久久久怡红院 | 国产精品福利片 | 国产人伦视频在线观看 | 亚欧成人中文字幕一区 | 伊人首页 | 手机免费在线视频 | 一级视频免费观看 | 国产成人精品免费视频大全办公室 | 日韩专区亚洲精品欧美专区 | 最近中文字幕mv在线高清 | 亚洲精品国产专区一区 |