靜態庫(.a):
靜態庫的**在編譯過程中已經被載入可執行程式,因此體積較大。
編譯程式時候需要庫作依賴,執行時候不需要。(方便,不再需要外部函式庫支援)
缺點:
1、因為靜態庫被鏈結後直接嵌入可執行程式中,相當於每乙個可執行程式裡都有乙個庫的副本,浪費空間;
2、一旦庫中有bug,需要重新編譯。
建立步驟:
1、編寫函式介面(.c)
vim file1.c
.......
vim file2.c
....... 2、
編譯成.o檔案
gcc -o file1.o -c file1.c
gcc -o file2.o -c file2.c
3、打包成庫(庫名稱以lib開頭)
ar -crs libmy.a file1.o file2.o
4、靜態庫使用(
編譯程式)
gcc -o main main.c -l. -lmy
5、直接執行
動態庫(.so):
共享庫的**是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此**體積較小。
編譯和執行程式都要有庫作依賴。
建立步驟:
1、編寫函式介面(.c)
vim file1.c
.......
vim file2.c
.......
2、編譯成.o檔案
-fpic:表示生成位置無關**(position independent code)
gcc
-fpic
-o file1.o -c file1.c
gcc -fpic -o file2.o -c file2.c
3、打包成庫(庫名稱以lib開頭)
gcc -shared -fpic -o libmy.so file1.o file2.o
4、靜態庫使用(
編譯程式)
gcc -o main main.c -l. -lmy
5、 ①
設定lib環境變數
export ld_library_path=$ld_library_path:庫存放的路徑
export ld_library_path=$ld_library_path:/mnt/hgfs/76期/系統程式設計/005/code/sharedlib
②直接把動態庫檔案拷貝到/lib或/usr/lib目錄下
③在/etc/ld.so.conf檔案裡加入我們生成的庫的目錄,然後/sbin/ldconfig
關於/etc/ld.so.conf:
裡面存放的是鏈結器和載入器搜尋共享庫時要檢查的目錄,預設是從/usr/lib /lib中讀取的,所以想要順利執行,我們也可以把我們庫的目錄加入到這個檔案中並執行/sbin/ldconfig
6、執行
檢視庫依賴(ldd):
ldd 檔案
看動態庫,如果目標程式沒有鏈結動態庫,則列印「not a dynamic executable」 (不是動態可執行檔案)
linux動態庫與靜態庫
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始。盡量不重複做別人已經做過的事,站在巨人的肩膀上 做事情。根據鏈結時期的不同,庫又有 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同,靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時...
Linux 靜態庫與動態(共享)庫
不論是在linux還是windows下程式設計,我們都會用到庫,有自身帶的標準庫,也有我們自己寫的庫,庫就是預先編譯好的的方法的集合。linux中的庫可以分為兩種,靜態庫和動態庫,動態庫也稱為共享庫。在linux中,庫名稱都以lib開始,靜態庫名為 lib a,動態庫名為 lib so。靜態庫和動態...
Linux中靜態庫與動態庫
在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...