青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

[轉]Linux下使用和生成庫

基本概念

庫有動態與靜態兩種,動態通常用.so為后綴,靜態用.a為后綴。例如:libhello.so libhello.a

為了在同一系統中使用不同版本的庫,可以在庫文件名后加上版本號為后綴,例如: libhello.so.1.0,由于程序連接默認以.so為文件后綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

使用庫

當要使用靜態的程序庫時,連接器會找出程序所需的函數,然后將它們拷貝到執行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記‘指明當程序執行時,首先必須載入這個庫。由于動態庫節省空間,linux下進行連接的缺省操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
現在假設有一個叫hello的程序開發包,它提供一個靜態庫libhello.a 一個動態庫libhello.so,一個頭文件hello.h,頭文件中提供sayhello()這個函數
/* hello.h */
void sayhello();
另外還有一些說明文檔。這一個典型的程序開發包結構
1.與動態庫連接
linux默認的就是與動態庫連接,下面這段程序testlib.c使用hello庫中的sayhello()函數

/*testlib.c*/
#include <hello.h>
#include <stdio.h>

int main()
{
sayhello();
return 0;
}

使用如下命令進行編譯
$gcc -c testlib.c -o testlib.o
用如下命令連接:
$gcc testlib.o -lhello -o testlib
在連接時要注意,假設libhello.o 和libhello.a都在缺省的庫搜索路徑下/usr/lib下,如果在其它位置要加上-L參數
與與靜態庫連接麻煩一些,主要是參數問題。還是上面的例子:
$gcc testlib.o -o testlib -WI,-Bstatic -lhello
注:這個特別的"-WI,-Bstatic"參數,實際上是傳給了連接器ld.
指示它與靜態庫連接,如果系統中只有靜態庫當然就不需要這個參數了。
如果要和多個庫相連接,而每個庫的連接方式不一樣,比如上面的程序既要和libhello進行靜態連接,又要和libbye進行動態連接,其命令應為:
$gcc testlib.o -o testlib -WI,-Bstatic -lhello -WI,-Bdynamic -lbye
3.動態庫的路徑問題
為了讓執行程序順利找到動態庫,有三種方法:
(1)把庫拷貝到/usr/lib和/lib目錄下。
(2)在LD_LIBRARY_PATH環境變量中加上庫所在路徑。例如動態庫libhello.so在/home/ting/lib目錄下,以bash為例,使用命令:
$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib
(3) 修改/etc/ld.so.conf文件,把庫所在的路徑加到文件末尾,并執行ldconfig刷新。這樣,加入的目錄下的所有庫文件都可見、
4.查看庫中的符號
有時候可能需要查看一個庫中到底有哪些函數,nm命令可以打印出庫中的涉及到的所有符號。庫既可以是靜態的也可以是動態的。nm列出的符號有很多,常見的有三種,一種是在庫中被調用,但并沒有在庫中定義(表明需要其他庫支持),用U表示;一種是庫中定義的函數,用T表示,這是最常見的;另外一種是所謂的“弱態”符號,它們雖然在庫中被定義,但是可能被其他庫中的同名符號覆蓋,用W表示。例如,假設開發者希望知道上央提到的hello庫中是否定義了printf():
$nm libhello.so |grep printf
U printf
U表示符號printf被引用,但是并沒有在函數內定義,由此可以推斷,要正常使用hello庫,必須有其它庫支持,再使用ldd命令查看hello依賴于哪些庫:
$ldd hello
libc.so.6=>/lib/libc.so.6(0x400la000)
/lib/ld-linux.so.2=>/lib/ld-linux.so.2 (0x40000000)
從上面的結果可以繼續查看printf最終在哪里被定義,有興趣可以go on


生成庫

第一步要把源代碼編繹成目標代碼。以下面的代碼為例,生成上面用到的hello庫:
/* hello.c */
#include <stdio.h>
void sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc -c hello.c -o hello.o

1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar cqs libhello.a hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由于可能存在多個版本,因此通常指定版本號:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立兩個符號連接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc -shared 參數使其生成是動態庫而不是普通執行程序。
-Wl 表示后面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有soname名字的文件,而不是庫的文件名,換句話說,soname是庫的區分標志。
這樣做的目的主要是允許系統中多個版本的庫文件共存,習慣上在命名庫文件的時候通常與soname相同
libxxxx.so.major.minor
其中,xxxx是庫的名字,major是主版本號,minor 是次版本號

posted on 2006-07-25 00:33 Jerry Cat 閱讀(578) 評論(0)  編輯 收藏 引用

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情成人在线| 欧美综合激情网| 亚洲免费在线视频| 国产精品99久久不卡二区| 亚洲精品免费网站| 亚洲日本成人网| 亚洲乱码精品一二三四区日韩在线 | 免费观看一区| 免费毛片一区二区三区久久久| 久久精品最新地址| 久久久不卡网国产精品一区| 免费久久久一本精品久久区| 欧美日韩国产在线播放| 国产精品国产三级国产普通话三级| 欧美性jizz18性欧美| 国产日韩欧美麻豆| 美女诱惑一区| 欧美日韩一区二| 国产欧美日韩视频一区二区三区 | 136国产福利精品导航| 亚洲欧洲在线一区| 亚洲欧美日韩区 | 久久精品噜噜噜成人av农村| 久久亚洲二区| 亚洲精品女av网站| 亚洲国产成人av在线| 一本久久知道综合久久| 久久精品麻豆| 欧美午夜理伦三级在线观看| 奶水喷射视频一区| 欧美刺激午夜性久久久久久久| 欧美日韩免费在线视频| 国内外成人在线视频| 夜夜嗨av一区二区三区四区 | 欧美在线视频在线播放完整版免费观看 | 美女免费视频一区| 欧美日韩中文字幕| 亚洲第一精品久久忘忧草社区| 一区二区三区欧美在线观看| 久久精品一区二区三区四区| 最新日韩精品| 久久精品99国产精品| 欧美日韩在线视频一区二区| 136国产福利精品导航网址| 亚洲综合精品四区| 欧美激情中文字幕在线| 欧美一进一出视频| 国产精品草草| 亚洲理伦在线| 欧美成人精品在线| 亚洲视频一起| 亚洲国产精品va| 久久久精品2019中文字幕神马| 亚洲激情另类| 久久这里有精品15一区二区三区| 国产精品久久久久久久浪潮网站| 日韩视频一区二区三区在线播放免费观看 | 欧美一区影院| 国产区在线观看成人精品| 亚洲深夜福利| 亚洲精品久久久久久久久久久久 | 午夜在线a亚洲v天堂网2018| 欧美日韩伦理在线免费| 亚洲精品中文字幕女同| 美女爽到呻吟久久久久| 欧美一区免费| 国产一区二区精品久久91| 欧美一级一区| 午夜精品视频在线观看一区二区| 欧美日韩免费在线观看| 亚洲午夜激情网页| 99亚洲一区二区| 欧美日韩一区精品| 亚洲欧美日韩一区二区三区在线观看| 亚洲精品欧洲精品| 欧美日韩一卡二卡| 欧美亚洲在线观看| 欧美一区二区三区在线观看视频 | 国产精品99久久久久久久久| 一本色道久久综合狠狠躁篇怎么玩 | 久热精品视频在线观看| 欧美综合国产| 91久久在线播放| 亚洲美女av在线播放| 国产精品久久久久毛片大屁完整版| 午夜天堂精品久久久久| 久久爱www| 亚洲国产婷婷| 一区二区久久| 激情综合久久| 亚洲级视频在线观看免费1级| 欧美精品在线播放| 欧美一区二粉嫩精品国产一线天| 欧美在线黄色| 99成人在线| 欧美一区2区三区4区公司二百| 亚洲激情欧美激情| 在线视频欧美日韩| 一区福利视频| 欧美不卡高清| 欧美日韩视频一区二区三区| 亚洲欧美成人一区二区三区| 亚洲欧洲在线一区| 国产精品亚洲一区| 六月天综合网| 国产精品久久久久久久久果冻传媒| 久久精品人人| 欧美亚州韩日在线看免费版国语版| 久久精品国产999大香线蕉| 欧美www在线| 久久高清福利视频| 老巨人导航500精品| 亚洲一区久久| 欧美成人精品在线视频| 欧美一区二区福利在线| 欧美成人综合一区| 久久这里只有精品视频首页| 国产精品v亚洲精品v日韩精品| 美国成人直播| 国产精品欧美激情| 亚洲人体影院| 曰本成人黄色| 欧美一区二区三区播放老司机| 一本久久a久久免费精品不卡| 久久本道综合色狠狠五月| 亚洲女人天堂成人av在线| 欧美大片免费观看| 免费在线日韩av| 国产一区二区三区在线观看网站| 一本色道久久综合亚洲精品婷婷| 亚洲精品久久久久久久久久久久| 欧美主播一区二区三区美女 久久精品人| 亚洲自啪免费| 欧美午夜精品久久久| 亚洲精华国产欧美| 亚洲激情视频在线| 噜噜爱69成人精品| 免费在线播放第一区高清av| 国产一区二区在线观看免费播放| 亚洲一区二区三区激情| 亚洲一区视频| 国产精品美女主播| 亚洲一区bb| 午夜精品美女自拍福到在线 | 亚洲天堂激情| 在线一区二区三区四区五区| 欧美3dxxxxhd| 亚洲精品一区在线| 亚洲香蕉视频| 国产精品欧美一区二区三区奶水 | 亚洲欧洲精品一区二区三区波多野1战4| 狠狠做深爱婷婷久久综合一区| 西瓜成人精品人成网站| 欧美一区二区视频97| 国产精品日韩在线一区| 亚洲视频www| 欧美一区二区三区四区夜夜大片| 国产精品综合| 久久久久**毛片大全| 亚洲国产高清在线观看视频| 亚洲精品一区二区三区福利| 欧美日韩精品国产| 午夜精品久久久99热福利| 一区二区三区欧美亚洲| 亚洲欧美在线磁力| 国产精品国产三级国产专播品爱网| 日韩视频第一页| 亚洲第一毛片| 欧美视频免费| 欧美一区二区三区四区在线| 欧美一区二区三区四区高清| 永久域名在线精品| 亚洲乱码国产乱码精品精天堂 | 欧美高清视频一区| 亚洲经典一区| 日韩午夜精品视频| 久久精品女人的天堂av| 欧美一区二区黄色| 亚洲欧美在线播放| 久久国产日本精品| 欧美第一黄网免费网站| 欧美在线黄色| 久久综合狠狠综合久久激情| 久久成人资源| 国产精品自拍视频| 亚洲国产成人精品久久| 亚洲欧美国产制服动漫| 欧美在线亚洲一区| 美女免费视频一区| 性感少妇一区| 好男人免费精品视频| 久久久国产成人精品| 久久精品国产欧美亚洲人人爽| 欧美色另类天堂2015| 欧美一区二区三区久久精品茉莉花| 亚洲欧美日韩精品久久久| 91久久亚洲| 欧美一区二区视频网站| 99国产精品久久| 久久露脸国产精品|