2010年7月17日 星期六

如何編出動態函式庫 (.so) 和靜態函式庫 (.a) 以及如何在編譯程式時使用他們

程式執行時會參照到library,其中又分動態連結與靜態連結。
使用動態連結的執行檔,他們的大小通常較小,而且在程式執行時一定要參照.so檔,在Linux裡可以用ldd指令去看某程式要參照什麼函式庫。.so檔通常放在/lib中,程式才會找到他。

而靜態連結的執行檔,檔案通常較大,而且在執行時不必再動態去參照函式庫。

.so檔是可共用的,相反地,.a則不行

製作動態連結函式庫:
ex. 1  
arm-linux-gcc audio_aiff.c audio_esd.c audio_null.c audio_oss.c audio_snd.c crc.c getopt1.c madplay.c resample.c tag.c audio_cdda.c audio_hex.c audio.c audio_raw.c audio_wave.c filter.c getopt.c player.c rgain.c version.c -shared -include config.h -o test.so -I /usr/local/openmoko/arm/include   最後生成test.so


ex. 2    
gcc a.c b.c -shared -o libtest.so  產生libtest.so


製作靜態連結函式庫:
ex. 1
先產生object file
gcc -c a.c b.c
再用ar,就可以了
ar crv libtest.a a.o b.o   (c表示創造新的archive r是插入新的目的檔到archive中 v是顯示詳細資訊  p.s d是從archive中刪除某目的檔)




編譯執行檔
gcc -o main main.c libtest.so (產生動態連結的執行檔) 
gcc -o main main.c libtest.a   (產生靜態連結的執行檔)


也可以這樣寫
gcc -c main.c
gcc -o main main.o -I. -L. -ltest 
-I表示程式要引入的標頭檔的所在位置,"."表示當前目錄
-L表示程式要使用的函式庫的所在位置,"."表示當前目錄


Reference


http://blog.yam.com/ytha/article/16636287
http://www.vr.ncue.edu.tw/esa/EmbeddedSystemProgramming2010/ch09.htm
http://www.wretch.cc/blog/tkulinux/21674597

沒有留言:

張貼留言