日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

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

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

關于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.

          生活不易,碼農辛苦
          如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
          程序員人生
          ------分隔線----------------------------
          分享到:
          ------分隔線----------------------------
          關閉
          程序員人生
          主站蜘蛛池模板: 日韩欧美一区二区三区免费观看 | 亚洲日本va中文字幕久久 | 看黄色一级视频 | 91精品久久久久久久99蜜桃 | 欧美视频成人 | 国产成人精品视频 | 精品一区二区三区在线观看国产 | 国产日韩视频 | 狠狠色狠狠色综合人人 | 久久精品国产一区二区电影 | 国产精品久久久久久久久久白浆 | 亚洲二区在线视频 | 日韩成人免费电影 | 国产精品国产三级国产专播精品人 | 91看看| 五月婷婷中文字幕 | 亚洲精品乱码久久久久久 | 中文字幕av一区二区三区 | 亚洲最新色 | 99精品视频在线免费观看 | 一区二区三区国产视频 | 最新中文字幕在线观看 | 亚洲美女视频一区 | 精品久久久中文字幕 | www.黄色在线观看 | 高清国产一区二区三区四区五区 | 91网站在线观看视频 | 夜夜艹日日艹 | 亚洲福利一区二区 | av在线免费网站 | 嫩草影院2019 | 日日干日日 | 婷婷99狠狠躁天天躁中文字幕 | 中文字幕国产区 | 日韩三级在线观看 | 免费观看污污视频 | 草久草久 | 欧美成人小视频 | av片在线观看网站 | 国产精品国产a级 | 国内精品久久久久久影视8 成人午夜影院 |