日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

静态与动态库文件

發布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态与动态库文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在windows中靜態庫是以?.lib?為后綴的文件,共享庫是以?.dll?為后綴的文件。在linux中靜態庫是以?.a?為后綴的文件,共享庫是以?.so為后綴的文件。
以linux下的靜態庫和動態庫為例我們研究一下,首先我們看一下他們的生成方式

靜態庫:
首先將源文件編譯成目標文件:gcc?–c?a.c?b.c
生成靜態庫:ar?–rc?libstatic.a?a.o?b.o

共享庫:
同靜態庫一樣編譯成目標文件:gcc?–c?a.c?b.c
生成共享庫:gcc?–fPIC?–shared?–o?libshared.so?a.o?b.o

???????由此可見靜態庫和動態庫都是對目標文件的處理,也可以說庫文件已經是機器碼文件了,靜態庫和共享庫的加載過程有很大的區別。

靜態庫的鏈接方法:
gcc?–o?staticcode?–L.?–lstatic?main.c?–static(默認庫在當前文件夾)

共享庫的鏈接方法:?
gcc?–o?sharedcode??-L.?–lshared?main.c(默認庫在當前文件夾)

???????當程序與靜態庫連接時,庫中目標文件所含的所有將被程序使用的函數的機器碼被copy到最終的可執行文件中。這就會導致最終生成的可執行代碼量相對變多,相當于編譯器將代碼補充完整了,這樣運行起來相對就快些。不過會有個缺點:?占用磁盤和內存空間.?靜態庫會被添加到和它連接的每個程序中,?而且這些程序運行時,?都會被加載到內存中.?無形中又多消耗了更多的內存空間.

???????與共享庫連接的可執行文件只包含它需要的函數的引用表,而不是所有的函數代碼,只有在程序執行時,?那些需要的函數代碼才被拷貝到內存中。這樣就使可執行文件比較小,?節省磁盤空間,更進一步,操作系統使用虛擬內存,使得一份共享庫駐留在內存中被多個程序使用,也同時節約了內存。不過由于運行時要去鏈接庫會花費一定的時間,執行速度相對會慢一些,總的來說靜態庫是犧牲了空間效率,換取了時間效率,共享庫是犧牲了時間效率換取了空間效率,沒有好與壞的區別,只看具體需要了。

????????另外,.一個程序編好后,有時需要做一些修改和優化,如果我們要修改的剛好是庫函數的話,在接口不變的前提下,使用共享庫的程序只需要將共享庫重新編譯就可以了,而使用靜態庫的程序則需要將靜態庫重新編譯好后,將程序再重新編譯一便。

?

總結:

?

一、庫的類型

(一) 在windows中

.dll 動態庫

.lib 靜態庫

庫即為源代碼的二進制文件

(二) 在linux中

.so 動態庫

.a????? 靜態庫

?

(三) 靜態庫和動態庫的優缺點

我們通常把一些公用函數制作成函數庫,供其它程序使用。

函數庫分為靜態庫和動態庫兩種。

靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。

動態庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在

?

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 -olibfoo.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.可執行程序在執行的時候如何定位共享庫文件

當系統加載可執行代碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑

此時就需要系統動態載入器(dynamiclinker/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中編譯靜態庫(.a)和動態庫(.so)的基本方法

?

(四) 靜態庫

?

在linux環境中, 使用ar命令創建靜態庫文件.如下是命令的選項:

????????? d -----從指定的靜態庫文件中刪除文件

????????? m -----把文件移動到指定的靜態庫文件中

????????? p -----把靜態庫文件中指定的文件輸出到標準輸出

????????? q -----快速地把文件追加到靜態庫文件中

????????? r -----把文件插入到靜態庫文件中

????????? t -----顯示靜態庫文件中文件的列表

????????? x -----從靜態庫文件中提取文件

????? 還有多個修飾符修改以上基本選項,詳細請man ar 以下列出三個:

????????? a -----把新的目標文件(*.o)添加到靜態庫文件中現有文件之后

????????? b-----***************************************之前

????????? v -----使用詳細模式

ar 命令的命令行格式如下:

????? ar[-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...

參數archive定義庫的名稱, files是庫文件中包含的目標文件的清單, 用空格分隔每個文件.

?

比如創建一個靜態庫文件的命令如下:

????? ar r libapue.a error.oerrorlog.o lockreg.o

這樣就了libapue.a靜態庫文件, 可以用 t 選項顯示包含在庫中的文件

創建庫文件之后,可以創建這個靜態庫文件的索引來幫助提高和庫連接的其他程序的編譯速度:

使用ranlib程序創建庫的索引,索引存放在庫文件內部.

????? ranlib libapue.a

?

用nm程序顯示存檔文件的索引,它可以顯示目標文件的符號

nm libapue.a | more

如果是顯示目標文件的符號:

nm error.o | more

如何使用呢?如下所示:

gcc -o test test.c libapue.a

這樣就可以在test.c中調用在libapue.a中的函數了.

?

?

(五) 動態庫

?

1.創建共享庫

???? gcc -shared -o libapue.soerror.o errorlog.o

這樣就創建了共享庫!

2.編譯共享庫

??? 假設共享庫位于當前目錄(即跟程序文件相同的目錄中)

gcc -o test -L. -lapue test.c

這樣就編譯出了不包含函數代碼可執行文件了,但是但你運行時會發現linux動態加載器找不到libapue.so文件.

可以用ldd 命令查看可執行文件依賴什么共享庫:

ldd test

如何才能讓動態加載器發現庫文件呢?有兩種方法可以解決:

??? 1.環境變量

?????? exportLD_LIBRARY_PATH="$LD_LIBRARY_PATH:."

??? 2.修改/etc/ld.so.conf文件.

?

一般應用程序的庫文件不與系統庫文件放在同一個目錄下,一般把應用程序的共享庫文件放在/usr/local/lib下,新建一個屬于自己的目錄apue,然后把剛才libapue.so復制過去就行了

同時在/etc/ld.so.conf中新增一行:

/usr/local/lib/apue

?

以后在編譯程序時加上編譯選項:

-L /usr/local/lib/apue -lapue

?

/*

參數的配置通過mangcc可以看到

-llibrary

????????????? 連接名為 library 的 庫文件.

????????????? 連接器 在 標準搜索目錄 中 尋找 這個 庫文件, 庫文件 的 真正 名 字

轉:http://blog.csdn.net/sunshinewave/article/details/39155755

轉載于:https://www.cnblogs.com/8335IT/p/8143534.html

總結

以上是生活随笔為你收集整理的静态与动态库文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.亚洲高清| 久久一区二区视频 | 欧美69精品久久久久久不卡 | 国产又粗又大又长 | 影音先锋精品 | 午夜影院在线观看视频 | 日韩天堂在线 | 中文字幕观看av | 春草 | 免费黄色在线观看 | 国产高清无密码一区二区三区 | 真人一及毛片 | 欧美日韩系列 | 久久er99热精品一区二区介绍 | 成人自拍视频在线 | 成人自拍视频在线观看 | 成人免费看黄 | 成人在线观看一区二区三区 | 狠狠干2024 | 国产激情av一区二区三区 | 欧美交| h网站免费在线观看 | 国产精品 欧美激情 | 九色porny自拍视频在线播放 | 国产三级网站 | 中文字幕在线观看线人 | 日韩aⅴ在线观看 | 瑟瑟久久 | 欧美日韩1区 | 美女黄18以下禁止观看 | 国产成人在线精品 | 欧美精品123| 人操人人 | 亚洲国产一区二区a毛片 | 久久久久久久久精 | 欧美激情视频在线观看 | 国产高清免费在线播放 | av免费网| 高h调教冰块play男男双性文 | 日韩欧美国产综合 | av片手机在线观看 | 日韩一区二区在线免费观看 | 日韩精品无码一本二本三本色 | 日韩美一区二区 | 抽插丰满内射高潮视频 | 99国产免费| 东京久久久 | 色欲一区二区三区精品a片 在线观看黄网站 | 亚洲阿v天堂 | 一区二区三区免费在线 | 久久久久久久久久网站 | 国产精品无码午夜福利 | 欧美一级做a爰片免费视频 成人激情在线观看 | 中国一区二区视频 | 亚洲区自拍偷拍 | 午夜激情啪啪 | 欧美成人激情 | 亚洲综合欧美 | 日韩人妻一区二区三区蜜桃视频 | tube日本69第一次 | 中文字幕在线观看一区 | 国产第一色 | xxx国产 | 日本久久99| 日韩av网址在线观看 | 欧美日韩亚洲国产 | 720url在线观看免费版 | 吃奶在线观看 | 中文字幕在线看高清电影 | 在线免费视频观看 | 欧美 亚洲 视频 | 色网视频 | 午夜精品久久久久久久久久久久久蜜桃 | 少妇熟女视频一区二区三区 | 一级特黄aaaaaa大片 | 美女网站黄页 | 亚洲三级成人 | 中国一及毛片 | 好吊色一区二区三区 | 天天做夜夜做 | 国产不卡在线观看 | 国产精品无码专区av在线播放 | 操bbbbb | ass日本粉嫩pics珍品 | 亚洲天堂五月 | 五月激情六月婷婷 | 丰满人妻一区二区三区性色 | 91视频论坛 | 欧美第一页草草影院 | 亚洲性网站 | 国产成人一区二区在线 | 国产欧美视频一区二区三区 | 91黄在线看 | av成人免费在线 | 亚洲综合久久婷婷 | 五月激情在线 | 五月婷婷亚洲综合 | 国产精品蜜 | 麻豆视频在线观看免费网站黄 |