探索靜態庫與動態庫的「奧秘」

2021-10-25 04:27:45 字數 2448 閱讀 8661

什麼是庫?

所謂「庫」,就是穩定成熟的可以復用的**;庫從本質上來說是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。

庫有兩種:靜態庫(.a(linux)、.lib(windows))和動態庫(.so(linux)、.dll(windows))。

所謂靜態、動態是指鏈結,可以看下編譯鏈結的過程:

庫與可執行檔案區別

靜態庫是什麼?

靜態庫實際就是一些目標檔案(一般以.o結尾)的集合,靜態庫一般以.a結尾,只用於鏈結生成可執行檔案階段。這裡注意區分下linux環境下是以.a結尾的,而windows環境下是以.lib結尾的(我這裡就使用linux版本進行,文章就主要以linux環境進行撰寫)

在鏈結步驟中,聯結器將從庫檔案取得所需的**,複製到生成的可執行檔案中。這種庫稱為靜態庫;

特點:

缺點:

靜態庫生成

建立靜態庫的步驟:

生成靜態庫案例

檔案:alibtest.h alibtest.cpp main.cpproot@izuf67on1pthsuih96udyfz:~/gdb/20201019# lsalibtest.cpp alibtest.h main.cpp

alibtest.h

#include

using

namespace std;

intgetparam()

;

alibtest.cpp

#include "alibtest.h"

int getparam()

製作動態庫:

root@izuf67on1pthsuih96udyfz:

~/gdb/

20201019# g++ alibtest.cpp -c

root@izuf67on1pthsuih96udyfz:

~/gdb/

20201019# ls

alibtest.cpp alibtest.h alibtest.o main.cpp

動態庫是什麼?

linux下動態庫檔案的檔名形如lib***.so,其中so是 shared object 的縮寫,即可以共享的目標檔案。

動態庫**在鏈結階段沒有被複製到程式中,而是程式在執行時由系統動態載入到記憶體中供程式呼叫。

特點:

優點:

動態庫生成

建立動態庫的步驟:

生成動態庫案例

還是上面的**,這裡直接使用上面的**進行動態庫的生成和使用

製作動態庫:

其實可以一步就生成:

g++ -fpic -shared -o libalibtest.so alibtest.cpp
我們直接將我們生成的檔案拷貝至/usr/lib下,再次執行:

root@izuf67on1pthsuih96udyfz:~/gdb/sharedtest# cp libalibtest.so /usr/lib

root@izuf67on1pthsuih96udyfz:~/gdb/sharedtest# ./main

res:11

當然,載入動態庫不止這一種方式,我們**中往往使用的是一些函式,具體會出一篇文章,先做個插曲~

小插曲(常用引數)

gdb 多執行緒之旅

肝!動態規劃

c++使用鎖注意事項

嘔心瀝血的遞迴

muduo原始碼剖析學習總結

windows程式崩潰除錯終極**

禁止拷貝構造,禁止bug

靜態庫與動態庫

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 ...