靜態庫和動態庫的分析

2021-08-06 02:43:18 字數 1602 閱讀 6885

學習筆記,小白可以相互學習,大佬看到能告訴咱理解不對的地方就好了。

庫的概念:

從本質上來說庫就是一種可執行**的二進位制形式,可被作業系統載入核心執行。

linux和windows本質不同,二者庫的二進位制是不相容的。

1.靜態庫

靜態庫在程式編譯時才會被連線到目標**中,程式執行時不需要該靜態庫,因此體積較大

1.1建立靜態庫

建立靜態庫使用ar命令,它將很多.o轉換成.a

a. gcc -c hello.c (生成hello.o檔案(目標檔案))

b. ar crs libmyhello.a hello.o(把目標檔案生成庫,myhello是庫名)

靜態庫的命名規範是以lib為字首,緊接著接靜態庫名,擴充套件名為.a

c. gcc -o hello main.c -l -lmyhello(編譯時記得鏈結庫)

2.動態庫

動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行時才被載入。動態庫把對一些函式的鏈結載入延遲到程式執行的時期。

2.1建立動態庫

a. gcc -fplc -wall -c hello.c(生成目標檔案)

b. gcc -shared -o libmyhello.so hello.o(生成庫檔案)

動態鏈結庫的名字形式為「lib***.so」,字尾名為.so

2.2使用動態庫的方法

1.cp limyhello.so /usr/lib/(直接把庫拷貝到/usr/lib目錄下)

2.在ld_library_path環境變數中加上庫所在路徑

設定路徑:export ld_library_path = /home/farsight/hello(這個是庫所在的目錄路徑,可使用命令pwd檢視當前路徑)

gcc test.c -lmyhello -l就可以了

3.新增/etc/ld.so.conf.d/*.conf檔案,把庫所在路徑加到檔案末尾,並執行ldconfig重新整理

建立sudo vim /etc/ld.so.conf.d/*.conf 檔案

再sudo ldconfig重新整理

再gcc test.c -lmahello -l編譯

最後直接./a.out執行就可了

ldd命令可以檢視乙個可執行程式依賴的共享庫

#ldd /bin/inlibc.so.6

Linux靜態庫和動態庫的分析

庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如 libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,通常使用建立符號連線的方...

關於Linux靜態庫和動態庫的分析

庫有動態與靜態兩種,動態通常用.so 為字尾,靜態用 a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾 例如 libhello.so.1.0,由於程式連線預設以 so為檔案字尾名。所以為了使用這些庫,通常使用建立符號連線的...

動態庫 版本 iOS 靜態庫 動態庫分析

ios開發中靜態庫和動態庫區別 靜態庫和動態庫是相對編譯期和執行期的 靜態庫在程式編譯時會被鏈結到目標 中,程式執行時將不再需要改靜態庫 而動態庫在程式編譯時並不會被鏈結到目標 中,只是在程式執行時才被載入,因為在程式執行期間還需要動態庫的存在。靜態庫 好處 模組化,分工合作,提高了 的復用及核心技...