我們都知道 *.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 下