靜態鏈結的優缺點:程式執行沒有其他依賴,可以直接執行;裝載速度快,但是可執行程式比較大,並如果多個程式使用同乙個庫中的函式,則這個函式的**在執行時記憶體就會有多份相同的庫函式**,會造成冗餘。
在我們寫**的時候,會有很多重複利用到的函式和**,當打包成庫,就可以在任何地方使用該函式和**,這樣子大大提高了我們的程式設計效率。現在我們來看看如何打包乙個庫函式
示例**:
child.c
#include
intprintchild()
child.h
intprintchild()
;
main.c
#include
#include
"child.h"
intmain()
1、將各個.c檔案編譯彙編成為目標檔案
gcc -c -fpic child.c -o child.o
2、打包成以.so為結尾的動態庫
gcc -share child.o -o libmychild.so
; 動態庫的命名方式lib***.so
動態庫的使用有3種方式
生成可執行檔案時鏈結使用:gcc main.c -o main -lmychild
-l指定庫名稱
但是我們發現說並找不到庫檔案,鏈結前還需要將我們的庫配置好,動態庫有3種方法
1、將庫檔案放到指定路徑下:/usr/lib64
or/usr/lib
但是放在系統庫中會汙染我門的原來的庫
2、設定鏈結庫的搜尋路徑環境變數-將庫檔案所在路徑新增進去:export library_path=$library_path:.
3、使用gcc -l選項指定鏈結庫的搜尋路徑
gcc main.c -o main -l./ -lmychild
ldd main
檢視main這個可執行程式依賴的動態庫
我們雖然可以鏈結成功,但是我們並不能成功執行main程式
執行可執行程式時載入使用方法
1、將庫檔案放到指定路徑下:/usr/lib64
or/usr/lib64
2、設定鏈結庫的接在路徑環境變數-將庫檔案所在路徑新增進去:export ld_library_path=$ld_library_path:.
如果鏈結的是動態庫,執行時就需要載入動態庫;如果鏈結的是靜態庫,執行時就不需要載入
1、將各個.c檔案編譯彙編成為目標檔案
gcc -c child.c -o child1.o
2、打包成以.a為結尾的靜態庫
ar -cr libmyachild.a child1.o
; 靜態庫的命名方式lib***.a
如何讓程式鏈結的是靜態庫:
1、將靜態庫放到指定路徑下
gcc 預設使用動態庫,那麼我們如何讓他使用靜態庫呢?
將我們的靜態庫放到乙個檔案中,讓它鏈結時去該目錄下找,由於該目錄只有靜態庫,此時就只能使用靜態庫gcc main.c -o main -l./lib -mychild
在新版本的linux 系統下安裝 glibc-devel、glibc和gcc-c++時,都不會安裝libc.a. 只安裝libc.so. 所以當使用-static時,libc.a不能使用。只能報找不到libc了。
解決方法:
安裝glibc-static
sudo yum install glibc-static
Linux靜態庫與動態庫
靜態庫 a 靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。編譯程式時候需要庫作依賴,執行時候不需要。方便,不再需要外部函式庫支援 缺點 1 因為靜態庫被鏈結後直接嵌入可執行程式中,相當於每乙個可執行程式裡都有乙個庫的副本,浪費空間 2 一旦庫中有bug,需要重新編譯。建立步驟 1 編寫函...
linux動態庫與靜態庫
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始。盡量不重複做別人已經做過的事,站在巨人的肩膀上 做事情。根據鏈結時期的不同,庫又有 靜態庫和共享庫 動態庫 二者的不同點在於 被載入的時刻不同,靜態庫的 在編譯過程中已經被載入可執行程式,因此體積較大。共享庫的 是在可執行程式執行時...
Linux 靜態庫與動態(共享)庫
不論是在linux還是windows下程式設計,我們都會用到庫,有自身帶的標準庫,也有我們自己寫的庫,庫就是預先編譯好的的方法的集合。linux中的庫可以分為兩種,靜態庫和動態庫,動態庫也稱為共享庫。在linux中,庫名稱都以lib開始,靜態庫名為 lib a,動態庫名為 lib so。靜態庫和動態...