1. 庫的介紹html
庫是寫好的現有的,成熟的,能夠複用的代碼。現實中每一個程序都要依賴不少基礎的底層庫,不可能每一個人的代碼都從零開始,所以庫的存在乎義非同尋常。linux
本質上來講庫是一種可執行代碼的二進制形式,能夠被操做系統載入內存執行。庫有兩種:靜態庫(.a、.lib)和動態庫(.so、.dll)。 windows上對應的是.lib .dll linux上對應的是.a .so程序員
所謂靜態、動態是指連接。windows
靜態庫
函數
之因此成爲【靜態庫】,是由於在連接階段,會將彙編生成的目標文件.o與引用到的庫一塊兒連接打包到可執行文件中。所以對應的連接方式稱爲靜態連接。工具
試想一下,靜態庫與彙編生成的目標文件一塊兒連接爲可執行文件,那麼靜態庫一定跟.o文件格式類似。其實一個靜態庫能夠簡單當作是一組目標文件(.o/.obj文件)的集合,即不少目標文件通過壓縮打包後造成的一個文件。靜態庫特色總結:操作系統
l 靜態庫對函數庫的連接是放在編譯時期完成的。htm
l 程序在運行時與函數庫再無瓜葛,移植方便。blog
l 浪費空間和資源,由於全部相關的目標文件與牽涉到的函數庫被連接合成一個可執行文件。進程
動態庫特色總結:
l 動態庫把對一些庫函數的連接載入推遲到程序運行的時期。
l 能夠實現進程之間的資源共享。(所以動態庫也稱爲共享庫)
l 將一些程序升級變得簡單。
l 甚至能夠真正作到連接載入徹底由程序員在程序代碼中控制(顯示調用)。
Window與Linux執行文件格式不一樣,在建立動態庫的時候有一些差別。
l 在Windows系統下的執行文件格式是PE格式,動態庫須要一個DllMain函數作出初始化的入口,一般在導出函數的聲明時須要有_declspec(dllexport)關鍵字。
l Linux下gcc編譯的執行文件默認是ELF格式,不須要初始化入口,亦不須要函數作特別的聲明,編寫比較方便。
與建立靜態庫不一樣的是,不須要打包工具(ar、lib.exe),直接使用編譯器便可建立動態庫。