在編寫程序的過程當中,對於一些接口每每抽象成lib庫的形式,甚至有些程序只有一個主程序,其餘接口的調用都是庫的形式存在。較多的使用庫會比較利於程序的維護,由於咱們的程序均可以被其餘的人使用,可是每每庫的存在會增長一些編譯上的問題。linux
在linux中有靜態庫和動態庫兩種,二者各有優劣,對於後端伺服的服務器來講,咱們更傾向於靜態庫,由於它部署方便,效率更高,然後端的服務器並不在乎那些靜態庫多佔用的內存。後端
對於靜態庫咱們要先理解其原理,靜態庫是一些目標文件的集合,一般爲後綴爲.o的文件,經過ar命令打包而成,通常命名的格式爲libXXX.a。在用戶建立可執行程序的過程當中,同-L指定靜態庫的地址,經過-lxxx指定靜態庫的名稱,完成靜態庫到主程序的連接。靜態庫只在程序連接的時候起做用,最終的程序脫離靜態庫運行。對於靜態庫咱們有下面的理解:服務器
1) 靜態庫的生成過程是一個編譯的過程,即只要.o文件生成了,就能夠生成靜態庫。若是.o文件中依賴了其餘靜態庫或者動態庫,在編譯靜態庫的時候不須要指定;函數
2) 鑑於1)在可執行程序編譯使用靜態庫的時候,必須本身指定靜態庫依賴的其餘庫,不然連接的時候會報錯,找不到一些函數。(這個地方不合理,靜態庫的產生者才更清楚它依賴哪些庫,如今反到要使用者關心?)spa
3) 編譯依賴庫的依賴關係,越基礎依賴的在後面,好比liba.a依賴libb.a,則在gcc中應該先 -la 再-lb。能夠經過xlinker參數來控制不考慮庫的訪問順序:-Xlinker "-(" –L ./lib –la –b -Xlinker "-)", 連接器在處理」-(」和」-)」之間的靜態庫時,會重複查找這些靜態庫,從而解決了靜態庫的查找順序問題。這種方式比人工提供連接順序的方式效率會低不少,可是在較大的項目裏面,咱們仍然建議使用這個參數。接口
4) 若是一個可執行程序須要依賴幾個靜態庫,而這些靜態庫的一些頭文件聲明瞭相同的函數,連接的時候會產生衝突報錯,即便你的可執行程序即沒有使用這些函數也沒有引用它們的頭文件。一個解決的辦法就是使用命名空間。內存
5) 既有動態也有靜態的同名庫的時候,優先調用的是動態庫;若是是隻是使用靜態庫能夠經過參數–Bstatic 指定,它等價於-dn、-non_shared、-static。部署