我們都知道 *.a 代表靜態庫;*.so 代表動態庫。那麼這兩個庫到底怎麼製作呢?
製作靜態庫的方法:
把**編譯為目標檔案形式:
# gcc -c liberr.c -o liberr.o
使用工具ar建立乙個存檔檔案:
# ar rcs liberr.a liberr.o
編譯程式時把程式和liberr.a
# gcc errtest.c -o errtest -static -l./ -lerr
製作動態庫的方法:
首先編譯目標檔案:
# gcc -fpic -g -c liberr.c -o liberr.o
#gcc -g -shared -wl,-soname,liberr.so -o liberr.so.1.0.0 liberr.o -lc
把生成的動態庫liberr.so.1.0.0拷貝到/usr/lib目錄裡:
#cp liberr.so.1.0.0 /usr/lib
進入/usr/lib
#cd /usr/lib
#ln -s liberr.so.1.0.0 liberr.so.1
#ln -s liberr.so.1.0.0 liberr.so
#gcc errtest.c -o errtest -lerr
附加的常識:
編譯時,標準的標頭檔案在 /usr/include 下,系統編譯時預設自動到這搜尋。
若要自定義的標頭檔案,使用者可通過在命令中加 –i 《庫路徑》 到額外指定的標頭檔案搜尋自己要包含的標頭檔案。
而系統預設的鏈結庫搜尋路徑在 /usr/lib , /lib 下,若要鏈結自己制定的庫要在命令中加上 -l《庫名》 -l 《庫的路徑》
其中:–l 指定要鏈結的具體庫名
-l 到額外庫搜尋的路徑
例:g++ hello.cpp –o hello –i /usr/lib/qt-3.1/include –lqt –l /usr/lib/qt-3.1/lib
解釋:-lqt 代表鏈結 qt 庫,其中qt 庫在/usr/lib/qt-3.1/lib下的名是libqt.so
–l /usr/lib/qt-3.1/lib 代表路徑在/usr/lib/qt-3.1/lib 下
Linux下製作靜態庫和動態庫
所謂庫檔案,就是一堆函式的集合。一堆函式原始碼的集合 c 一堆二進位制函式 的集合 so 使用者可以呼叫庫裡面的函式,但是沒有辦法看到函式的實現過程。在linux裡面,庫有兩種,一種是靜態庫 lib x.a 另外一種是動態庫 共享庫 lib x.so 例子 libabc.so.0.8 lib 庫的字...
Linux下製作動態庫與靜態庫
靜態函式庫 1.這類庫的名字一般是lib a 2.利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進可執行檔案了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程...
Linux靜態庫和動態庫的製作
1.什麼是庫檔案?儲存函式和變數 特點 儲存的函式與變數只能使用但不能看到其實現 2.linux庫檔案 靜態庫 在編譯階段載入 將庫檔案的 載入到原始檔 動態庫 在執行時載入 3.生成可執行檔案存在的區別 優缺點 1 使用靜態庫生成的可執行檔案大於動態庫生成的可執行檔案 程式占用的記憶體較多 2 使...