什麼是庫?所謂「庫」,就是穩定成熟的可以復用的**;庫從本質上來說是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。
庫有兩種:靜態庫(.a(linux)、.lib(windows))和動態庫(.so(linux)、.dll(windows))。
所謂靜態、動態是指鏈結,可以看下編譯鏈結的過程:
庫與可執行檔案區別:
靜態庫是什麼?靜態庫實際就是一些目標檔案(一般以
.o
結尾)的集合,靜態庫一般以.a
結尾,只用於鏈結生成可執行檔案階段。這裡注意區分下linux
環境下是以.a
結尾的,而windows
環境下是以.lib
結尾的(我這裡就使用linux
版本進行,文章就主要以linux
環境進行撰寫)
在鏈結步驟中,聯結器將從庫檔案取得所需的**,複製到生成的可執行檔案中。這種庫稱為靜態庫;
特點:
缺點:
靜態庫生成建立靜態庫的步驟:
生成靜態庫案例檔案:
alibtest.h alibtest.cpp main.cpp
root@izuf67on1pthsuih96udyfz:~/gdb/20201019# ls
alibtest.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 ...