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

大龍的博客

常用鏈接

統(tǒng)計

最新評論

關(guān)于linux動態(tài)庫和靜態(tài)庫的使用

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

在創(chuàng)建函數(shù)庫前,我們先來準備舉例用的源程序,并將函數(shù)庫的源程序編譯成.o文件。


第1步:編輯得到舉例的程序--hello.h、hello.c和main.c;

hello.c(見程序2)是函數(shù)庫的源程序,其中包含公用函數(shù)hello,該函數(shù)將在屏幕上輸出"
Hello XXX!"。hello.h(見程序1)為該函數(shù)庫的頭文件。main.c(見程序3)為測試庫文件的
主程序,在主程序中調(diào)用了公用函數(shù)hello。

#ifndef HELLO_H
#define HELLO_H

void hello(const char *name);

#endif //HELLO_H
程序1: hello.h

#include <stdio.h>

void hello(const char *name)
{
printf("Hello %s!\n", name);
}
程序2: hello.c

#include "hello.h"

int main()
{
hello("everyone");
return 0;
}
程序3: main.c

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

無論靜態(tài)庫,還是動態(tài)庫,都是由.o文件創(chuàng)建的。因此,我們必須將源程序hello.c通過g
cc先編譯成.o文件。

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

# gcc -c hello.c

#

我們運行l(wèi)s命令看看是否生存了hello.o文件。

# ls

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

#


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

下面我們先來看看如何創(chuàng)建靜態(tài)庫,以及使用它。

第3步:由.o文件創(chuàng)建靜態(tài)庫;

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

在系統(tǒng)提示符下鍵入以下命令將創(chuàng)建靜態(tài)庫文件libmyhello.a。

# ar crv libmyhello.a hello.o

#

我們同樣運行l(wèi)s命令查看結(jié)果:

# ls

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

#

ls命令結(jié)果中有l(wèi)ibmyhello.a。

第4步:在程序中使用靜態(tài)庫;

靜態(tài)庫制作完了,如何使用它內(nèi)部的函數(shù)呢?只需要在使用到這些公用函數(shù)的源程序中包
含這些公用函數(shù)的原型聲明,然后在用gcc命令生成目標文件時指明靜態(tài)庫名,gcc將會從
靜態(tài)庫中將公用函數(shù)連接到目標文件中。注意,gcc會在靜態(tài)庫名前加上前綴lib,然后追
加擴展名.a得到的靜態(tài)庫文件名來查找靜態(tài)庫文件。

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

(# gcc -o hello main.c -L. -lmyhello??) (這句是作者的注釋可以不用理)

#gcc main.c libmyhello.a -o main

# ./hello

Hello everyone! (這里估計是作者寫錯了,是# ./main)

#

我們刪除靜態(tài)庫文件試試公用函數(shù)hello是否真的連接到目標文件 hello中了。

# rm libmyhello.a

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

# ./hello (這里估計是作者寫錯了,是# ./main)

Hello everyone!

#

程序照常運行,靜態(tài)庫中的公用函數(shù)已經(jīng)連接到目標文件中了。

我們繼續(xù)看看如何在Linux中創(chuàng)建動態(tài)庫。我們還是從.o文件開始。

第5步:由.o文件創(chuàng)建動態(tài)庫文件;

動態(tài)庫文件名命名規(guī)范和靜態(tài)庫文件名命名規(guī)范類似,也是在動態(tài)庫名增加前綴lib,但其
文件擴展名為.so。例如:我們將創(chuàng)建的動態(tài)庫名為myhello,則動態(tài)庫文件名就是libmyh
ello.so。用gcc來創(chuàng)建動態(tài)庫。

在系統(tǒng)提示符下鍵入以下命令得到動態(tài)庫文件libmyhello.so。

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

#

我們照樣使用ls命令看看動態(tài)庫文件是否生成。

# ls

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

#

第6步:在程序中使用動態(tài)庫;

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

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

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shar
ed object file: No such file or directory

#

哦!出錯了。快看看錯誤提示,原來是找不到動態(tài)庫文件libmyhello.so。程序在運行時,
會在/usr/lib和/lib等目錄中查找需要的動態(tài)庫文件。若找到,則載入動態(tài)庫,否則將提
示類似上述錯誤而終止程序運行。我們將文件libmyhello.so復(fù)制到目錄/usr/lib中,再試
試。

# mv libmyhello.so /usr/lib (這一步由于我用的不是root用戶,移動時提示權(quán)限不夠,在這步前加條$su命令,取權(quán)限)

# ./hello

Hello everyone!

#


(
這步后我沒有成功,無論是用#權(quán)限還是$都報錯說我權(quán)限不夠。報錯內(nèi)容如下:
[root@localhost 20090505]# ./hello
./hello: error while loading shared libraries: /usr/lib/libmyhello.so: cannot restore segment prot after reloc: Permission denied
[root@localhost 20090505]# exit
exit
[pin@localhost 20090505]$ ./hello
./hello: error while loading shared libraries: /usr/lib/libmyhello.so: cannot restore segment prot after reloc: Permission denied
查了一下發(fā)現(xiàn)是原來這是
SELinux搞的鬼,解決辦法有兩個
1. 使用chcon 命令
示例: chcon -t texrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so
(這步我從 SELinux故障診斷瀏覽器的提示,用了chcon -t texrel_shlib_t /usr/lib/libmyhello.so命     令)
2.禁止掉selinux
更改/etc/sysconfig/selinux 文件的內(nèi)容為 SELINUX=disabled
)

成功了。這也進一步說明了動態(tài)庫在程序運行時是需要的。

# ldd hello
執(zhí)行 test,可以看到它是如何調(diào)用動態(tài)庫中的函數(shù)的。
[pin@localhost 20090505]$ ldd hello
linux-gate.so.1 => (0x00110000)
libmyhello.so => /usr/lib/libmyhello.so (0x00111000)
libc.so.6 => /lib/libc.so.6 (0x00859000)
/lib/ld-linux.so.2 (0x0083a000)

我們回過頭看看,發(fā)現(xiàn)使用靜態(tài)庫和使用動態(tài)庫編譯成目標程序使用的gcc命令完全一樣,
那當靜態(tài)庫和動態(tài)庫同名時,gcc命令會使用哪個庫文件呢?抱著對問題必究到底的心情,
來試試看。

先刪除除.c和.h外的所有文件,恢復(fù)成我們剛剛編輯完舉例程序狀態(tài)。

# rm -f hello hello.o /usr/lib/libmyhello.so

# ls

hello.c hello.h main.c

#

在來創(chuàng)建靜態(tài)庫文件libmyhello.a和動態(tài)庫文件libmyhello.so。

# gcc -c hello.c

# ar cr libmyhello.a hello.o

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

# ls

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

#

通過上述最后一條ls命令,可以發(fā)現(xiàn)靜態(tài)庫文件libmyhello.a和動態(tài)庫文件libmyhello.s
o都已經(jīng)生成,并都在當前目錄中。然后,我們運行g(shù)cc命令來使用函數(shù)庫myhello生成目標
文件hello,并運行程序 hello。

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

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shar
ed object file: No such file or directory

#

從程序hello運行的結(jié)果中很容易知道,當靜態(tài)庫和動態(tài)庫同名時, gcc命令將優(yōu)先使用動
態(tài)庫。

Note:
編譯參數(shù)解析
最主要的是GCC命令行的一個選項:
-shared 該選項指定生成動態(tài)連接庫(讓連接器生成T類型的導(dǎo)出符號表,有時候也生成弱連接W類型的導(dǎo)出符號),不用該標志外部程序無法連接。相當于一個可執(zhí)行文件
l -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關(guān)的所以動態(tài)載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
l -L.:表示要連接的庫在當前目錄中
l -ltest:編譯器查找動態(tài)連接庫時有隱含的命名規(guī)則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
l LD_LIBRARY_PATH:這個環(huán)境變量指示動態(tài)連接器可以裝載動態(tài)庫的路徑。
l 當然如果有root權(quán)限的話,可以修改/etc/ld.so.conf文件,然后調(diào)用 /sbin/ldconfig來達到同樣的目的,不過如果沒有root權(quán)限,那么只能采用輸出LD_LIBRARY_PATH的方法了。

調(diào)用動態(tài)庫的時候有幾個問題會經(jīng)常碰到,有時,明明已經(jīng)將庫的頭文件所在目錄 通過 “-I” include進來了,庫所在文件通過 “-L”參數(shù)引導(dǎo),并指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈接的so文件,這時你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件來指定動態(tài)庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了。
[]


靜態(tài)庫鏈接時搜索路徑順序:

1.          ld會去找GCC命令中的參數(shù)-L

2.          再找gcc的環(huán)境變量LIBRARY_PATH

3.          再找內(nèi)定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內(nèi)的

l         動態(tài)鏈接時、執(zhí)行時搜索路徑順序:

1.          編譯目標代碼時指定的動態(tài)庫搜索路徑;

2.          環(huán)境變量LD_LIBRARY_PATH指定的動態(tài)庫搜索路徑;

3.          配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑;

4.          默認的動態(tài)庫搜索路徑/lib;

5.          默認的動態(tài)庫搜索路徑/usr/lib。

有關(guān)環(huán)境變量:

LIBRARY_PATH環(huán)境變量:指定程序靜態(tài)鏈接庫文件搜索路徑

LD_LIBRARY_PATH環(huán)境變量:指定程序動態(tài)鏈接庫文件搜索路徑

posted on 2011-01-05 11:28 大龍 閱讀(1205) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久av二区| 欧美黄色一级视频| 影音先锋亚洲一区| 国内精品久久国产| 伊人春色精品| 日韩天堂在线视频| 亚洲永久在线观看| 久久久国产午夜精品| 免费亚洲婷婷| 洋洋av久久久久久久一区| 亚洲欧美资源在线| 久久久久久久久久久成人| 久久亚洲精品视频| 亚洲第一在线| 亚洲无线观看| 另类欧美日韩国产在线| 欧美日本高清视频| 国产日韩综合一区二区性色av| 极品少妇一区二区三区精品视频| 亚洲乱码久久| 欧美中文字幕在线| 亚洲国产欧美一区| 亚洲小视频在线观看| 久久久成人精品| 国产精品成人播放| 亚洲国产综合在线看不卡| 亚洲欧美成人网| 久久天堂精品| 亚洲免费综合| 欧美日韩一视频区二区| 亚洲第一区色| 久久av在线| 日韩视频在线观看国产| 久久久亚洲精品一区二区三区| 欧美午夜久久| 亚洲精品一区在线观看| 久热国产精品视频| 亚洲中无吗在线| 欧美日韩国产在线播放| 亚洲第一主播视频| 久久久91精品国产| 亚洲欧美日韩国产中文| 国产精品久久国产三级国电话系列| 亚洲欧洲精品一区二区精品久久久| 久久精品视频在线看| 亚洲视频香蕉人妖| 欧美色123| 亚洲一区999| 一本色道综合亚洲| 欧美精品系列| 亚洲美女免费精品视频在线观看| 久久久91精品国产一区二区精品| 亚洲一区二区在线观看视频| 国产精品www网站| 亚洲网站在线播放| 日韩一区二区精品葵司在线| 欧美日韩国产成人| 亚洲深夜福利| 亚洲视频在线观看一区| 国产精品私房写真福利视频| 亚洲欧美999| 亚洲综合不卡| 国产亚洲精品v| 久久久国产精彩视频美女艺术照福利 | 亚洲欧美精品一区| 宅男噜噜噜66国产日韩在线观看| 久久久久久久一区二区| 欧美一区视频| 国产精品久久久| 亚洲欧美日韩在线观看a三区| 中文在线一区| 国内精品免费午夜毛片| 免费在线观看日韩欧美| 欧美刺激午夜性久久久久久久| 亚洲精品午夜| 亚洲精品一级| 国产精品网站视频| 另类春色校园亚洲| 欧美国产先锋| 午夜精品福利在线观看| 久久精品国产亚洲a| 亚洲国产一区二区三区在线播 | 亚洲综合999| 激情欧美一区二区三区在线观看 | 亚洲色在线视频| 欧美一区二区三区视频在线 | 美女精品国产| 亚洲综合不卡| 久久久久久久国产| 一区二区三区产品免费精品久久75| 中文在线一区| 亚洲高清资源| 正在播放欧美一区| 亚洲高清资源综合久久精品| 99视频精品全国免费| 国产一区在线播放| 亚洲毛片在线免费观看| 国产有码一区二区| 亚洲日本激情| 狠狠色狠狠色综合| 亚洲精品视频免费在线观看| 国产三级欧美三级| 亚洲精品国产精品乱码不99| 国产午夜精品一区二区三区欧美 | 国产香蕉97碰碰久久人人| 亚洲国产精品成人综合色在线婷婷| 国产精品久久久久99| 欧美激情国产精品| 国产亚洲制服色| 一区二区三区免费看| 亚洲电影免费在线| 午夜视频在线观看一区二区三区| 日韩五码在线| 久久免费视频在线观看| 欧美在线1区| 欧美午夜电影完整版| 亚洲欧洲一区| 亚洲国产导航| 久久久久成人精品| 久久xxxx| 狠色狠色综合久久| 国产精品久久久久久五月尺| 麻豆成人综合网| 国产日韩在线看| 亚洲在线观看免费视频| 亚洲视频成人| 欧美日韩在线精品| 日韩一二三区视频| 亚洲一区二区黄| 欧美日韩亚洲精品内裤| 亚洲人成精品久久久久| 日韩视频精品| 欧美日韩国产成人在线免费| 亚洲国产精品嫩草影院| 亚洲日本欧美在线| 欧美国产一区二区三区激情无套| 免费日韩一区二区| 亚洲国产精品va| 欧美成人午夜影院| 亚洲精品午夜精品| 亚洲亚洲精品在线观看| 欧美午夜激情在线| 亚洲在线一区二区三区| 久久都是精品| 国内偷自视频区视频综合| 久久久www| 欧美激情中文不卡| 国产精品99久久久久久久女警| 欧美色图天堂网| 亚洲一区二区视频在线| 久久精品一区四区| 亚洲国产一区在线| 欧美日韩国产一区| 亚洲午夜免费福利视频| 久久久久久久成人| 亚洲欧洲视频在线| 国产精品久久久一区二区三区 | 欧美一区二区三区视频在线观看| 久久精品视频在线免费观看| 国产在线精品二区| 你懂的成人av| 在线亚洲伦理| 老司机午夜精品| 日韩一本二本av| 国产日韩精品一区二区三区在线 | 亚洲午夜精品一区二区| 久久久欧美一区二区| 亚洲日韩欧美一区二区在线| 国产精品久久久久久久久久久久久 | 久久超碰97中文字幕| 亚洲国产天堂网精品网站| 国产精品mv在线观看| 久久精品亚洲| 亚洲午夜一区| 亚洲黑丝一区二区| 久久精品免费| 99热这里只有成人精品国产| 国产字幕视频一区二区| 欧美无乱码久久久免费午夜一区 | 男男成人高潮片免费网站| 久久九九99| 久久中文精品| 亚洲一级黄色av| 亚洲国产精品黑人久久久| 国产精品区一区二区三区| 久久天堂成人| 亚洲欧美激情诱惑| 日韩午夜中文字幕| 嫩模写真一区二区三区三州| 亚洲尤物视频网| 亚洲精品视频中文字幕| 激情综合网激情| 国产三级欧美三级日产三级99| 欧美精品 国产精品| 久久综合色综合88| 久久久精品动漫| 久久久久国产精品麻豆ai换脸| 小嫩嫩精品导航| 性刺激综合网| 午夜欧美精品|