日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
深入探究Linux共享庫(kù)實(shí)現(xiàn)的奧秘(linux共享庫(kù)實(shí)現(xiàn))

Linux操作系統(tǒng)是開源的,其特點(diǎn)之一就是支持共享庫(kù)的方式實(shí)現(xiàn)程序的動(dòng)態(tài)鏈接。共享庫(kù)的實(shí)現(xiàn)在Linux操作系統(tǒng)中十分重要,它極大地促進(jìn)了程序的開發(fā)、編譯和部署。本文將,從共享庫(kù)的定義、原理、優(yōu)缺點(diǎn)和應(yīng)用等方面展開探究。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供南溪網(wǎng)站建設(shè)、南溪做網(wǎng)站、南溪網(wǎng)站設(shè)計(jì)、南溪網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、南溪企業(yè)網(wǎng)站模板建站服務(wù),10年南溪做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一、共享庫(kù)的定義和原理

共享庫(kù)是指一類可以被多個(gè)程序共享使用的代碼庫(kù),可以被程序動(dòng)態(tài)鏈接調(diào)用。在Linux系統(tǒng)中,共享庫(kù)通常使用文件名以“.so”結(jié)尾的文件。共享庫(kù)的實(shí)現(xiàn)可以有效解決傳統(tǒng)的靜態(tài)鏈接庫(kù)方式存在的問題,即節(jié)省內(nèi)存空間,并且可以方便地升級(jí)和維護(hù)。

共享庫(kù)實(shí)現(xiàn)的原理是將需要共享的代碼打包成動(dòng)態(tài)鏈接庫(kù)文件,并加載到內(nèi)存中,程序在運(yùn)行時(shí)可以通過動(dòng)態(tài)鏈接庫(kù)調(diào)用需要的函數(shù)。這種方式可以使得多個(gè)程序共用同一個(gè)庫(kù),避免了重復(fù)代碼和浪費(fèi)內(nèi)存的問題。

二、共享庫(kù)的優(yōu)缺點(diǎn)

與靜態(tài)鏈接庫(kù)相比,共享庫(kù)具有以下優(yōu)點(diǎn):

1. 節(jié)省內(nèi)存空間:多個(gè)程序可以共用同一個(gè)庫(kù),避免了重復(fù)代碼和浪費(fèi)內(nèi)存的問題。

2. 程序升級(jí)方便:共享庫(kù)的實(shí)現(xiàn)可以方便對(duì)庫(kù)進(jìn)行升級(jí)和維護(hù),而不像靜態(tài)鏈接庫(kù)需要重新編譯整個(gè)程序。

3. 加快編譯速度:編譯時(shí)只需生成一個(gè)共享庫(kù)文件,而不是多個(gè)靜態(tài)鏈接庫(kù)文件,加快了編譯速度。

但共享庫(kù)也存在以下缺點(diǎn):

1.性能問題:由于動(dòng)態(tài)鏈接的原因,共享庫(kù)的性能一般不如靜態(tài)鏈接庫(kù)。

2.兼容問題:由于動(dòng)態(tài)鏈接的文件版本問題,共享庫(kù)在不同版本的Linux操作系統(tǒng)中可能存在兼容性問題。

三、共享庫(kù)的應(yīng)用

共享庫(kù)廣泛應(yīng)用于Linux系統(tǒng)下的軟件開發(fā)和部署,包括:

1.開發(fā)工具:如GCC等開發(fā)工具本身就是使用共享庫(kù)的方式實(shí)現(xiàn)進(jìn)而降低不必要的代碼冗余。

2.運(yùn)行庫(kù):像C運(yùn)行庫(kù)、C++運(yùn)行庫(kù)等各種運(yùn)行庫(kù)都是使用共享庫(kù)的方式實(shí)現(xiàn)。

3.圖形界面庫(kù):像GTK、QT等圖形界面庫(kù)都是使用共享庫(kù)的方式實(shí)現(xiàn)。

4.網(wǎng)絡(luò)庫(kù):像OpenSSL、libcurl等網(wǎng)絡(luò)庫(kù)也都是使用共享庫(kù)的方式實(shí)現(xiàn)。

共享庫(kù)是Linux系統(tǒng)中十分重要的實(shí)現(xiàn)方式,它的應(yīng)用廣泛,明顯提高了程序的開發(fā)效率和部署效率。以上我們從共享庫(kù)的定義、原理、優(yōu)缺點(diǎn)和應(yīng)用等方面展開了深入探究Linux共享庫(kù)的實(shí)現(xiàn)奧秘。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220

linux 用g++編譯c++代碼的問題

1,注釋掉 12行的CLOCKS_PER_SEC

2,你在open之察寬櫻前,單獨(dú)創(chuàng)建一個(gè)string對(duì)象,把文件巧巧名保存好;

string fullname = “/home/wangwenyu/c13.03/more” + filename + “.in” ;

然后再去調(diào)用敗叢 fout.open

*

運(yùn)行 gcc/egcs

*

gcc/egcs 的主要選項(xiàng)

*

gdb

*

gdb 的常用命令

*

gdb 使用范例

*

其他程序/庫(kù)工具 (ar, objdump, nm, size, strings, strip, …)

* 創(chuàng)建和使用靜態(tài)庫(kù)

* 創(chuàng)建和使用共享庫(kù)

* 使用高級(jí)共享庫(kù)特性

1.7.1 運(yùn)行 gcc/egcs

Linux 中最重要的軟件開發(fā)工具是 GCC。GCC 是 GNU 的 C 和 C++ 編譯器。實(shí)際上,GCC 能夠編譯三種語(yǔ)言:C、C++ 和 Object C(C 語(yǔ)言的一種面向?qū)ο髷U(kuò)展)。利用 gcc 命令可同時(shí)編譯并連接 C 和 C++ 源程序。

#DEMO#: hello.c

如果你有兩個(gè)或少數(shù)幾個(gè) C 源文件,也可以方便地利用 GCC 編譯、連接并生成可執(zhí)行文件。例如,假設(shè)攔陸爛你有兩個(gè)源文件 main.c 和 factorial.c 兩個(gè)源文件,現(xiàn)在要編譯生成一個(gè)計(jì)算階乘的程序。

清單 factorial.c

#include

#include

int factorial (int n)

{

if (n

#include

int factorial (int n);

int main (int argc, char **argv)

{

int n;

if (argc

void main (void)

{

cout

#include

static char buff ;

static char* string;

int main ()

{

printf (“Please input a string: “);

gets (string);

printf (“\nYour string is: %s\n”, string);

}

上面這個(gè)程序非常簡(jiǎn)單,其目的是接受用戶的輸入,然后將用戶的輸入打印出來(lái)。該程序使用了

一個(gè)未經(jīng)過初始化的字符串地址 string,因此,編譯并運(yùn)行之后,將出現(xiàn) Segment Fault 錯(cuò)誤:

$ gcc -o test -g test.c

$ ./test

Please input a string: asfd

Segmentation fault (core dumped)

為了查找該程序中出現(xiàn)的問題,我們利用 gdb,并按如下的步驟進(jìn)行:

1.運(yùn)行 gdb bugging 命令,裝入 bugging 可執(zhí)行文件;

2.執(zhí)行裝入的 bugging 命令;

3.使用 where 命令查看程序出錯(cuò)的地方;

4.利用 list 命令查看調(diào)用 gets 函數(shù)附近的代碼;

5.唯一能夠?qū)е?gets 函數(shù)出錯(cuò)的因素就是變量 string。用 print 命令查看 string 的值;

6.在 gdb 中,我們可以直接修改變量的值,只要將 string 取一個(gè)合法的指針值就可以了,為

此,我們?cè)诘?11 行處設(shè)置斷點(diǎn);

7.程序重新運(yùn)行到第 11 行處停止,這時(shí),我們可以用 set variable 命令修改 string 的取值;

8.然后繼續(xù)運(yùn)行,將看到正確的程序運(yùn)行結(jié)果。

#DEMO#

1.7.6 其他程序/庫(kù)工具

strip:

nm:

size:

string:

1.7.7 創(chuàng)建和使用靜態(tài)庫(kù)

創(chuàng)建一個(gè)靜態(tài)庫(kù)是相當(dāng)簡(jiǎn)單的。通常使用 ar 程序把一些目標(biāo)文件(.o)組合在一起,成為一個(gè)單獨(dú)的庫(kù),然后運(yùn)行 ranlib,以給庫(kù)加入一些索引信息。

1.7.8 創(chuàng)建和使用共享庫(kù)

特殊的編譯和連接選項(xiàng)

-D_REENTRANT使得預(yù)處理器符號(hào) _REENTRANT 被定義,這個(gè)符號(hào)激活一些宏特性。

-fPIC 選項(xiàng)產(chǎn)生位置獨(dú)立的代碼。由于庫(kù)是在運(yùn)行的時(shí)候被調(diào)入,因此這個(gè)

選項(xiàng)是必需的,因?yàn)樵诰幾g的時(shí)候,裝入內(nèi)存的地址還不知道。如果

不使用這個(gè)選項(xiàng),庫(kù)文件可能不會(huì)正確運(yùn)行。

-shared選項(xiàng)告訴編譯器產(chǎn)生共享庫(kù)代碼。

-Wl,-sonameWl 告訴編譯器將后面的參數(shù)傳遞到連接器。而 -soname 指定了

共享庫(kù)的 soname。

# 可以把庫(kù)文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,并以

root 身份運(yùn)行 ldconfig;或者

# 運(yùn)行 export LD_LIBRARY_PATH=’pwd’,它把當(dāng)前路徑加到庫(kù)搜索路徑中去。

1.7.9 使用高級(jí)共享庫(kù)特性

1. ldd 工具

ldd 用來(lái)顯示執(zhí)行文件需要哪些共享庫(kù), 共享庫(kù)裝載管理器在哪里找到了需要的共享庫(kù).

2. soname

共享庫(kù)的一個(gè)非常重要的,也是非常難的概念是 soname——簡(jiǎn)寫共享目標(biāo)名(short for shared object name)。這是一個(gè)為共享庫(kù)(.so)文件而內(nèi)嵌在控制數(shù)據(jù)中的名字。如前面提到的,每一個(gè)程序都有一個(gè)需要使用的庫(kù)的清單。這個(gè)清單的內(nèi)容是一系列庫(kù)的 soname,如同 ldd 顯示的那樣,共享庫(kù)裝載器必須找到這個(gè)清單。

soname 的關(guān)鍵功能是它提供了兼容性的標(biāo)準(zhǔn)。當(dāng)要升級(jí)系統(tǒng)中的一個(gè)庫(kù)時(shí),并且新庫(kù)的 soname 和老的庫(kù)的 soname 一樣,用舊庫(kù)連接生成的程序,使用新的庫(kù)依然能正常運(yùn)行。這個(gè)特性使得在 Linux 下,升級(jí)使用共享庫(kù)的程序和定位錯(cuò)誤變得十分容易。

在 Linux 中,應(yīng)用程序通過使用 soname,來(lái)指定所希望庫(kù)的版本。庫(kù)作者也可以通過保留或者改變 soname 來(lái)聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫(kù)版本沖突問題的困擾。

查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫(kù)文件之間的關(guān)系

3. 共享庫(kù)裝載器

當(dāng)程序被調(diào)用的時(shí)候,Linux 共享庫(kù)裝載器(也被稱為動(dòng)態(tài)連接器)也自動(dòng)被調(diào)用。它的作用是保證程序所需要的所有適當(dāng)版本的庫(kù)都被調(diào)入內(nèi)存。共享庫(kù)裝載器名字是 ld.so 或者是 ld-linux.so,這取決于 Linux libc 的版本,它必須使用一點(diǎn)外部交互,才能完成自己的工作。然而它接受在環(huán)境變量和配置文件中的配置信息。

文件 /etc/ld.so.conf 定義了標(biāo)準(zhǔn)系統(tǒng)庫(kù)的路徑。共享庫(kù)裝載器把它作為搜索路徑。為了改變這個(gè)設(shè)置,必須以 root 身份運(yùn)行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個(gè)文件其實(shí)是裝載器內(nèi)部使用的文件之一。

可以使用許多環(huán)境變量控制共享庫(kù)裝載器的操作(表1-4+)。

表 1-4+ 共享庫(kù)裝載器環(huán)境變量

變量含義

LD_AOUT_LIBRARY_PATH除了不使用 a.out 二進(jìn)制格式外,與 LD_LIBRARY_PATH 相同。

LD_AOUT_PRELOAD除了不使用 a.out 二進(jìn)制格式外,與 LD_PRELOAD 相同。

LD_KEEPDIR 只適用于 a.out 庫(kù);忽略由它們指定的目錄。

LD_LIBRARY_PATH將其他目錄加入庫(kù)搜索路徑。它的內(nèi)容應(yīng)該是由冒號(hào)

分隔的目錄列表,與可執(zhí)行文件的 PATH 變量具有相同的格式。

如果調(diào)用設(shè)置用戶 ID 或者進(jìn)程 ID 的程序,該變量被忽略。

LD_NOWARN 只適用于 a.out 庫(kù);當(dāng)改變版本號(hào)是,發(fā)出警告信息。

LD_PRELOAD 首先裝入用戶定義的庫(kù),使得它們有機(jī)會(huì)覆蓋或者重新定義標(biāo)準(zhǔn)庫(kù)。

使用空格分開多個(gè)入口。對(duì)于設(shè)置用戶 ID 或者進(jìn)程 ID 的程序,

只有被標(biāo)記過的庫(kù)才被首先裝入。在 /etc/ld.so.perload 中指定

了全局版本號(hào),該文件不遵守這個(gè)限制。

4. 使用 dlopen

另外一個(gè)強(qiáng)大的庫(kù)函數(shù)是 dlopen()。該函數(shù)將打開一個(gè)新庫(kù),并把它裝入內(nèi)存。該函數(shù)主要用來(lái)加載庫(kù)中的符號(hào),這些符號(hào)在編譯的時(shí)候是不知道的。比如 Apache Web 服務(wù)器利用這個(gè)函數(shù)在運(yùn)行過程中加載模塊,這為它提供了額外的能力。一個(gè)配置文件控制了加載模塊的過程。這種機(jī)制使得在系統(tǒng)中添加或者刪除一個(gè)模塊時(shí),都不需要重新編譯了。

可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,并在 dl 庫(kù)中實(shí)現(xiàn)。它需要兩個(gè)參數(shù):一個(gè)文件名和一個(gè)標(biāo)志。文件名可以是我們學(xué)習(xí)過的庫(kù)中的 soname。標(biāo)志指明是否立刻計(jì)算庫(kù)的依賴性。如果設(shè)置為 RTLD_NOW 的話,則立刻計(jì)算;如果設(shè)置的是 RTLD_LAZY,則在需要的時(shí)候才計(jì)算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加載的庫(kù)可以獲得其中的符號(hào)。

linux的shell編程與用gcc實(shí)現(xiàn)c編程有什么不同?有什么優(yōu)點(diǎn)?

shell編程屬于腳本編程,腳本文件就是指令的,GCC是GNU編譯系統(tǒng)驅(qū)動(dòng)程序。

Linux中的庫(kù)分兩種:靜態(tài)庫(kù)和共享庫(kù)。靜態(tài)庫(kù)以.a結(jié)尾,也叫歸檔文件(archive),類似于windows中的.lib文件,他的缺點(diǎn)是同時(shí)運(yùn)行的多個(gè)程序使用同個(gè)函數(shù)庫(kù)函數(shù)時(shí),內(nèi)存中會(huì)有多個(gè)該函數(shù)及該程序文件的副本,浪費(fèi)了內(nèi)存。共享庫(kù)以.so結(jié)尾乎罩,類似于windows中的.Dll文件。

shell是對(duì)linux內(nèi)核歲逗鬧的一種封裝,提供了一些函數(shù)的接口,shell程序設(shè)計(jì)就是利用這些函數(shù)接口進(jìn)行編程。

完全是兩個(gè)方向的應(yīng)用??偟膩?lái)說,不具備可比性。但實(shí)際要看應(yīng)用環(huán)境。相對(duì)來(lái)說,shell 的程序還是以簡(jiǎn)單的功能為主。大型的應(yīng)用程序還是 C 語(yǔ)言指輪更合適。

linux 共享庫(kù)實(shí)現(xiàn)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 共享庫(kù)實(shí)現(xiàn),深入探究Linux共享庫(kù)實(shí)現(xiàn)的奧秘,linux 用g++編譯c++代碼的問題,linux的shell編程與用gcc實(shí)現(xiàn)c編程有什么不同?有什么優(yōu)點(diǎn)?的信息別忘了在本站進(jìn)行查找喔。

成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開發(fā)和營(yíng)銷公司。廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)、設(shè)計(jì)、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!


網(wǎng)站欄目:深入探究Linux共享庫(kù)實(shí)現(xiàn)的奧秘(linux共享庫(kù)實(shí)現(xiàn))
文章來(lái)源:http://www.5511xx.com/article/cdpehje.html