linux作業系統下編譯靜態庫與動態庫 linux的庫檔案分為兩種,一種是靜態庫(*.a檔案,相當於Windows下的*.lib檔案),另一種是動態庫(*.so檔案,相當於Windows下的*.dll檔案)。編譯時間,一種就是把自己編譯的.o檔案(相當於Windows下的.obj檔案)和靜態庫一起連結成可執行檔,另一種就是只編譯.o檔案,當運行時,調用動態庫中的函數時,再載入動態庫。 編譯方法如下: 1. 靜態庫 假如源檔案件為:main.c, mystatic.c。 1) 將mystatic.c編譯成靜態庫libmystatic.a,在main.c中調用此庫中的函數。 gcc -c -I inlcude -o mystaic.o mystatic.c // 將mystatic.c編譯成目標檔案mystatic.o ar -rs lib/libmystaic.a mystatic.o // 將目標mystaic.o加入libmystatic.a庫中(庫檔案需以lib開頭),如果libmystatic.a不存在建立此庫 2) 再將main.c編譯成可執行檔test。 gcc -I include -L lib -o test main.c -lmystatic -static 則編譯成功,在檔案夾lib下成功產生libmystatic.a的庫檔案,並編出的可執行程式test運用了庫libmystatic.a 2. 動態庫 源檔案件為:main.c, mydynamic.c。 1) 將mydynamic.c編譯成動態庫libmydynamic.so,在main.c中調用了此庫中的函數。 gcc -I include -shared -o lib/libmydynamic.so mydynamic.c // 庫檔案需以lib開頭 2) 將main.c編譯成可執行檔test。 gcc -I include -L lib -o test main.c -lmydynamic // 不帶參數-static,預設為動態編譯 3) 運行可執行程式test。 在運行程式test時,系統會在系統預設的庫檔案目錄下搜尋mydynamic.so,如果找不到運行失敗。需將剛才編譯的動態庫目錄加入系統,具體方法如下: 修改~/.bash_profile(此檔案為隱藏檔案,用ls -a ~/可將其顯示出來)檔案,在檔案末尾加入: LD_LIBRARY_PATH=*** #(***為libmydynamic.so所在的目錄) export LD_LIBRARY_PATH 重新登入系統,運行可執行檔test檔案將會成功。
3.編譯時間要使用共用庫dl 其中有dlopen dlsynm dlerror dlclose 函數