多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

分析Linux系統的靜態庫和動態庫問題

來源:程序員人生   發布時間:2014-04-30 05:03:56 閱讀次數:3270次
1.什么是庫
在windows平臺和linux平臺下都大量存在著庫。
本質上來說庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。
由于windows和linux的本質不同,因此二者庫的二進制是不兼容的。
本文僅限于介紹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.minor,xxxx是該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.h、hello.c和main.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);
}

程序3: main.c
#include "hello.h"

int main()
{
hello("everyone");
return 0;
}

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

無論靜態庫,還是動態庫,都是由.o文件創建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。

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

# gcc -c hello.c

#

(注1:本文不介紹各命令使用和其參數功能,若希望詳細了解它們,請參考其他文檔。)

(注2:首字符"#"是系統提示符,不需要鍵入,下文相同。)

我們運行ls命令看看是否生存了hello.o文件。

# ls

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

#

(注3:首字符不是"#"為系統運行結果,下文相同。)

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美婷婷| 亚洲欧美成人 | 老师邪恶影院a啦啦啦影院 老司机av | 亚洲精品中文字幕无乱码 | 豆国产97在线 | 欧洲 | 国产精品久久久久久久久久久不卡 | 国产青草亚洲香蕉精品久久 | 日本爱爱小视频 | 香蕉久久ac一区二区三区 | 视频一区 中文字幕 | 美女视频h | 中文字幕一级 | 午夜dj在线观看免费高清视频在线观看 | 国语高清精品一区二区三区 | 国产第一页无线好源 | 中文字幕免费视频精品一 | 片免费观看网站视频 | 我爱我色成人网 | 性亚洲 | 亚洲中午字幕 | 亚洲成a人片在线观看播放 亚洲成a人片在线观看精品 | 久久精品国产2020 | 在线看亚洲 | 日本午夜视频在线 | 福利片免费一区二区三区 | 羞羞在线观看 | 中文字幕福利视频 | 德国free 性video| 国产精品高清一区二区 | 波多野结衣被强在线视频 | 泰国一级毛片aaa下面毛多 | 动漫日本在线免费观看 | 另类专区国产在线视频 | 欧美白人黑人xxxx猛交 | 欧美最刺激好看的一级毛片 | 久久中文字幕不卡一二区 | 大香伊在人线免费 | 亚洲欧美久久婷婷爱综合一区天堂 | 国产精品日韩欧美一区二区 | 在线观看www | 欧美xxxx做受欧美精品 |