結論:
庫中包含的是讓使用者呼叫的一些函式,有了庫,程式中不需要自己實現這些函式,直接呼叫庫中的函式即可,節約開發時間,提高開發效率;
8.靜態庫的特點
編譯(鏈結)時把靜態庫中相應的**複製到可執行檔案中,有以下兩個特點:
1> 程式中已包含**,執行時不再需要靜態庫
注意:複製時,複製的是靜態庫中部分**,即程式中呼叫了哪些函式,就會把這些函式的**複製進來,而非整個庫檔案複製進來;
2> 程式執行時無需載入庫,執行速度更快;
缺點:
1> 占用更多的磁碟和記憶體空間
2> 靜態庫公升級後,程式需要重新編譯鏈結
9.靜態庫的建立
1> 庫名
以lib開始,以.a結束,.a表示靜態庫
一般庫名代表庫中函式的功能,比如:libc,代表c庫,libm代表數學庫等;
庫中的目標檔案可以是乙個.o,也可以是多個.o
2> 靜態庫的建立
1)確定庫中函式的功能,介面
2) 編寫庫的原始碼
3)編譯庫原始碼,生成二進位制檔案
4)寫測試**,呼叫庫中**
3>檢視庫中符號資訊,即庫中包含的函式名稱
nm 庫檔名
eg:nm libcommon.a
1.共享庫的特點
編譯(鏈結)時僅記錄用到哪個共享庫的哪個符號(一般指函式名),不複製共享庫中的**;
1>程式不包含庫中的** 尺寸小;
2>多個程式可共用同乙個庫;
3> 程式執行時需要載入庫;
4> 庫公升級方便,無需重新編譯程式;
2.共享庫的建立
1>確定庫中函式的功能,介面
2>建立共享庫檔案
3>編寫共享庫原始碼
4>為共享庫檔案建立符號鏈結檔案
5> 鏈結共享庫檔案
注意:
-fpic的作用:
告訴編譯器,生成與位置無關的**;即生成的.o檔案中的**可以被載入到任意位址執行,而非只能在固定位址執行;
原因:
3.執行時找不到庫的原因:
因為程式執行時鏈結共享庫,而沒有複製共享庫中的**,所以,程式執行時,系統會引導程式中用到的共享庫,載入時回去預設
路徑,比如:/lib /usr/lib 下找共享庫,而共享庫沒有放在預設路徑下,所以會報錯;
.1製作靜態庫
1.將標頭檔案發布到/usr/local/include
sudo mv test.h /usr/local/include
2.將庫函式.c檔案編譯成.o檔案
gcc -c test.c -o test.o
3.生成靜態庫
ar -cr lib庫名.a test.o
//例如 ar -cr libstat.a test.o
4.將庫函式發布到/usr/local/lib
sudo mv lib庫名.a /usr/local/lib
5.編譯主函式的時候加上鏈結
gcc main.c -l庫名
gcc main.c -l庫的路徑
.2製作動態庫
1.將標頭檔案發布到/usr/local/include
sudo mv test.h /usr/local/include
2.將庫函式.c檔案編譯成動態庫檔案
gcc -shared -fpic test.c -o lib庫名.so
3.將庫檔案發布到/usr/local/lib
sudo mv lib庫名.so /usr/local/lib
4.在/etc/ld.so.conf.d/libc.conf最後一行新增庫檔案的路徑
/usr/local/lib
5.重新整理配置檔案
sudo ldconfig
6.gcc main.c -l庫名
ldd 可執行程式 //檢視當前程式所使用的動態庫有哪些 靜態庫與動態庫
linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...
靜態庫與動態庫
庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...
靜態庫與動態庫
1.靜態庫 工程在呼叫靜態庫時,複製靜態庫,源 加長,不節省程式空間。字尾名.a 優點 程式設計後不需要再依賴庫 以空間換時間 建立靜態庫 gcc c 原始檔.c ar rcs rcu 靜態庫名 目標檔案1 目標檔案2 rc 靜態庫不存在,就建立該庫檔案 s 更新靜態庫 使用 gcc o file ...