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

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供南溪網(wǎng)站建設、南溪做網(wǎng)站、南溪網(wǎng)站設計、南溪網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、南溪企業(yè)網(wǎng)站模板建站服務,10年南溪做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
一、共享庫的定義和原理
共享庫是指一類可以被多個程序共享使用的代碼庫,可以被程序動態(tài)鏈接調(diào)用。在Linux系統(tǒng)中,共享庫通常使用文件名以“.so”結(jié)尾的文件。共享庫的實現(xiàn)可以有效解決傳統(tǒng)的靜態(tài)鏈接庫方式存在的問題,即節(jié)省內(nèi)存空間,并且可以方便地升級和維護。
共享庫實現(xiàn)的原理是將需要共享的代碼打包成動態(tài)鏈接庫文件,并加載到內(nèi)存中,程序在運行時可以通過動態(tài)鏈接庫調(diào)用需要的函數(shù)。這種方式可以使得多個程序共用同一個庫,避免了重復代碼和浪費內(nèi)存的問題。
二、共享庫的優(yōu)缺點
與靜態(tài)鏈接庫相比,共享庫具有以下優(yōu)點:
1. 節(jié)省內(nèi)存空間:多個程序可以共用同一個庫,避免了重復代碼和浪費內(nèi)存的問題。
2. 程序升級方便:共享庫的實現(xiàn)可以方便對庫進行升級和維護,而不像靜態(tài)鏈接庫需要重新編譯整個程序。
3. 加快編譯速度:編譯時只需生成一個共享庫文件,而不是多個靜態(tài)鏈接庫文件,加快了編譯速度。
但共享庫也存在以下缺點:
1.性能問題:由于動態(tài)鏈接的原因,共享庫的性能一般不如靜態(tài)鏈接庫。
2.兼容問題:由于動態(tài)鏈接的文件版本問題,共享庫在不同版本的Linux操作系統(tǒng)中可能存在兼容性問題。
三、共享庫的應用
共享庫廣泛應用于Linux系統(tǒng)下的軟件開發(fā)和部署,包括:
1.開發(fā)工具:如GCC等開發(fā)工具本身就是使用共享庫的方式實現(xiàn)進而降低不必要的代碼冗余。
2.運行庫:像C運行庫、C++運行庫等各種運行庫都是使用共享庫的方式實現(xiàn)。
3.圖形界面庫:像GTK、QT等圖形界面庫都是使用共享庫的方式實現(xiàn)。
4.網(wǎng)絡庫:像OpenSSL、libcurl等網(wǎng)絡庫也都是使用共享庫的方式實現(xiàn)。
共享庫是Linux系統(tǒng)中十分重要的實現(xiàn)方式,它的應用廣泛,明顯提高了程序的開發(fā)效率和部署效率。以上我們從共享庫的定義、原理、優(yōu)缺點和應用等方面展開了深入探究Linux共享庫的實現(xiàn)奧秘。
成都網(wǎng)站建設公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導10多年以來專注數(shù)字化網(wǎng)站建設,提供企業(yè)網(wǎng)站建設,高端網(wǎng)站設計,響應式網(wǎng)站制作,設計師量身打造品牌風格,熱線:028-86922220linux 用g++編譯c++代碼的問題
1,注釋掉 12行的CLOCKS_PER_SEC
2,你在open之察寬櫻前,單獨創(chuàng)建一個string對象,把文件巧巧名保存好;
string fullname = “/home/wangwenyu/c13.03/more” + filename + “.in” ;
然后再去調(diào)用敗叢 fout.open
*
運行 gcc/egcs
*
gcc/egcs 的主要選項
*
gdb
*
gdb 的常用命令
*
gdb 使用范例
*
其他程序/庫工具 (ar, objdump, nm, size, strings, strip, …)
* 創(chuàng)建和使用靜態(tài)庫
* 創(chuàng)建和使用共享庫
* 使用高級共享庫特性
1.7.1 運行 gcc/egcs
Linux 中最重要的軟件開發(fā)工具是 GCC。GCC 是 GNU 的 C 和 C++ 編譯器。實際上,GCC 能夠編譯三種語言:C、C++ 和 Object C(C 語言的一種面向?qū)ο髷U展)。利用 gcc 命令可同時編譯并連接 C 和 C++ 源程序。
#DEMO#: hello.c
如果你有兩個或少數(shù)幾個 C 源文件,也可以方便地利用 GCC 編譯、連接并生成可執(zhí)行文件。例如,假設攔陸爛你有兩個源文件 main.c 和 factorial.c 兩個源文件,現(xiàn)在要編譯生成一個計算階乘的程序。
清單 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);
}
—
上面這個程序非常簡單,其目的是接受用戶的輸入,然后將用戶的輸入打印出來。該程序使用了
一個未經(jīng)過初始化的字符串地址 string,因此,編譯并運行之后,將出現(xiàn) Segment Fault 錯誤:
$ gcc -o test -g test.c
$ ./test
Please input a string: asfd
Segmentation fault (core dumped)
為了查找該程序中出現(xiàn)的問題,我們利用 gdb,并按如下的步驟進行:
1.運行 gdb bugging 命令,裝入 bugging 可執(zhí)行文件;
2.執(zhí)行裝入的 bugging 命令;
3.使用 where 命令查看程序出錯的地方;
4.利用 list 命令查看調(diào)用 gets 函數(shù)附近的代碼;
5.唯一能夠?qū)е?gets 函數(shù)出錯的因素就是變量 string。用 print 命令查看 string 的值;
6.在 gdb 中,我們可以直接修改變量的值,只要將 string 取一個合法的指針值就可以了,為
此,我們在第 11 行處設置斷點;
7.程序重新運行到第 11 行處停止,這時,我們可以用 set variable 命令修改 string 的取值;
8.然后繼續(xù)運行,將看到正確的程序運行結(jié)果。
#DEMO#
1.7.6 其他程序/庫工具
strip:
nm:
size:
string:
1.7.7 創(chuàng)建和使用靜態(tài)庫
創(chuàng)建一個靜態(tài)庫是相當簡單的。通常使用 ar 程序把一些目標文件(.o)組合在一起,成為一個單獨的庫,然后運行 ranlib,以給庫加入一些索引信息。
1.7.8 創(chuàng)建和使用共享庫
特殊的編譯和連接選項
-D_REENTRANT使得預處理器符號 _REENTRANT 被定義,這個符號激活一些宏特性。
-fPIC 選項產(chǎn)生位置獨立的代碼。由于庫是在運行的時候被調(diào)入,因此這個
選項是必需的,因為在編譯的時候,裝入內(nèi)存的地址還不知道。如果
不使用這個選項,庫文件可能不會正確運行。
-shared選項告訴編譯器產(chǎn)生共享庫代碼。
-Wl,-sonameWl 告訴編譯器將后面的參數(shù)傳遞到連接器。而 -soname 指定了
共享庫的 soname。
# 可以把庫文件拷貝到 /etc/ld.so.conf 中列舉出的任何目錄中,并以
root 身份運行 ldconfig;或者
# 運行 export LD_LIBRARY_PATH=’pwd’,它把當前路徑加到庫搜索路徑中去。
1.7.9 使用高級共享庫特性
1. ldd 工具
ldd 用來顯示執(zhí)行文件需要哪些共享庫, 共享庫裝載管理器在哪里找到了需要的共享庫.
2. soname
共享庫的一個非常重要的,也是非常難的概念是 soname——簡寫共享目標名(short for shared object name)。這是一個為共享庫(.so)文件而內(nèi)嵌在控制數(shù)據(jù)中的名字。如前面提到的,每一個程序都有一個需要使用的庫的清單。這個清單的內(nèi)容是一系列庫的 soname,如同 ldd 顯示的那樣,共享庫裝載器必須找到這個清單。
soname 的關鍵功能是它提供了兼容性的標準。當要升級系統(tǒng)中的一個庫時,并且新庫的 soname 和老的庫的 soname 一樣,用舊庫連接生成的程序,使用新的庫依然能正常運行。這個特性使得在 Linux 下,升級使用共享庫的程序和定位錯誤變得十分容易。
在 Linux 中,應用程序通過使用 soname,來指定所希望庫的版本。庫作者也可以通過保留或者改變 soname 來聲明,哪些版本是相互兼容的,這使得程序員擺脫了共享庫版本沖突問題的困擾。
查看/usr/local/lib 目錄,分析 MiniGUI 的共享庫文件之間的關系
3. 共享庫裝載器
當程序被調(diào)用的時候,Linux 共享庫裝載器(也被稱為動態(tài)連接器)也自動被調(diào)用。它的作用是保證程序所需要的所有適當版本的庫都被調(diào)入內(nèi)存。共享庫裝載器名字是 ld.so 或者是 ld-linux.so,這取決于 Linux libc 的版本,它必須使用一點外部交互,才能完成自己的工作。然而它接受在環(huán)境變量和配置文件中的配置信息。
文件 /etc/ld.so.conf 定義了標準系統(tǒng)庫的路徑。共享庫裝載器把它作為搜索路徑。為了改變這個設置,必須以 root 身份運行 ldconfig 工具。這將更新 /etc/ls.so.cache 文件,這個文件其實是裝載器內(nèi)部使用的文件之一。
可以使用許多環(huán)境變量控制共享庫裝載器的操作(表1-4+)。
表 1-4+ 共享庫裝載器環(huán)境變量
變量含義
LD_AOUT_LIBRARY_PATH除了不使用 a.out 二進制格式外,與 LD_LIBRARY_PATH 相同。
LD_AOUT_PRELOAD除了不使用 a.out 二進制格式外,與 LD_PRELOAD 相同。
LD_KEEPDIR 只適用于 a.out 庫;忽略由它們指定的目錄。
LD_LIBRARY_PATH將其他目錄加入庫搜索路徑。它的內(nèi)容應該是由冒號
分隔的目錄列表,與可執(zhí)行文件的 PATH 變量具有相同的格式。
如果調(diào)用設置用戶 ID 或者進程 ID 的程序,該變量被忽略。
LD_NOWARN 只適用于 a.out 庫;當改變版本號是,發(fā)出警告信息。
LD_PRELOAD 首先裝入用戶定義的庫,使得它們有機會覆蓋或者重新定義標準庫。
使用空格分開多個入口。對于設置用戶 ID 或者進程 ID 的程序,
只有被標記過的庫才被首先裝入。在 /etc/ld.so.perload 中指定
了全局版本號,該文件不遵守這個限制。
4. 使用 dlopen
另外一個強大的庫函數(shù)是 dlopen()。該函數(shù)將打開一個新庫,并把它裝入內(nèi)存。該函數(shù)主要用來加載庫中的符號,這些符號在編譯的時候是不知道的。比如 Apache Web 服務器利用這個函數(shù)在運行過程中加載模塊,這為它提供了額外的能力。一個配置文件控制了加載模塊的過程。這種機制使得在系統(tǒng)中添加或者刪除一個模塊時,都不需要重新編譯了。
可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,并在 dl 庫中實現(xiàn)。它需要兩個參數(shù):一個文件名和一個標志。文件名可以是我們學習過的庫中的 soname。標志指明是否立刻計算庫的依賴性。如果設置為 RTLD_NOW 的話,則立刻計算;如果設置的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加載的庫可以獲得其中的符號。
linux的shell編程與用gcc實現(xiàn)c編程有什么不同?有什么優(yōu)點?
shell編程屬于腳本編程,腳本文件就是指令的,GCC是GNU編譯系統(tǒng)驅(qū)動程序。
Linux中的庫分兩種:靜態(tài)庫和共享庫。靜態(tài)庫以.a結(jié)尾,也叫歸檔文件(archive),類似于windows中的.lib文件,他的缺點是同時運行的多個程序使用同個函數(shù)庫函數(shù)時,內(nèi)存中會有多個該函數(shù)及該程序文件的副本,浪費了內(nèi)存。共享庫以.so結(jié)尾乎罩,類似于windows中的.Dll文件。
shell是對linux內(nèi)核歲逗鬧的一種封裝,提供了一些函數(shù)的接口,shell程序設計就是利用這些函數(shù)接口進行編程。
完全是兩個方向的應用??偟膩碚f,不具備可比性。但實際要看應用環(huán)境。相對來說,shell 的程序還是以簡單的功能為主。大型的應用程序還是 C 語言指輪更合適。
linux 共享庫實現(xiàn)的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關于linux 共享庫實現(xiàn),深入探究Linux共享庫實現(xiàn)的奧秘,linux 用g++編譯c++代碼的問題,linux的shell編程與用gcc實現(xiàn)c編程有什么不同?有什么優(yōu)點?的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開發(fā)和營銷公司。廣泛應用于計算機網(wǎng)絡、設計、SEO優(yōu)化、關鍵詞排名等多種行業(yè)!
新聞名稱:深入探究Linux共享庫實現(xiàn)的奧秘(linux共享庫實現(xiàn))
瀏覽路徑:http://www.fisionsoft.com.cn/article/cdpehje.html


咨詢
建站咨詢
