程式執行時會參照到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
沒有留言:
張貼留言