2008年11月13日 星期四

如何在編譯程式時link自己的libarary和header file

在C編譯器下,我們可以利用-I的旗標告訴編譯器,標頭檔案放在其他子目錄

例如:
$gcc -I/usr/sample/include sample.c
這指示編譯器去/usr/sample/include的目錄下找尋必要的header檔

再來我們想要link我們自己的libarary,
我們可以利用-L跟-l來告訴編譯器函式庫的位置與欲link的函式庫的名稱

例如:
$gcc -o sample sample.c /usr/lib/libm.a
上述的指令是直接跟gcc說述的指令是直接跟gcc說明我要link的函式庫的位置與名稱

$gcc -o sample sample.c -L/usr/lib -lsample
上述的指令是在跟gcc說明-L(放libarary的檔案路徑) -l(欲link的函式庫名稱)
通常同一個函式庫會有動態函式庫和靜態函式庫若是用上述的方式link gcc會先去link動態函式庫

2008年11月12日 星期三

生成動態函式庫與靜態函式的方法in linux

靜態函式庫的生成:

在LINUX底下我們可以利用ar程式(名稱就是因為它會產生archives)來幫我們建立靜態函式庫
方法如下:
$ar crv (函式庫名稱)註1 (obj檔1) (obj檔2) ......

範例:
假設我想把 bill.o fred.o 這兩個obj檔做成一個叫libfoo.a靜態函式庫我可以下這樣的指令
$ar crv libfoo.a bill.o fred.o

再來我們利用gcc這個編譯器來幫我們建立動態函式庫
方法如下:
$gcc -shared -o (函式庫名稱) (source檔1) (source檔2) .....

範例:
假設我想把bill.c fred.c 這兩個source檔做成一個叫libfoo.so動態函式庫我可以下這樣的指令
$gcc -shared -o libfoo.so bill.c fred.c

註1:當我們在取函式庫的名稱時有一定的命名方式,其命名方式如下:
lib(函式庫名稱).a //靜態函式庫
lib(函式庫名稱).so //動態函式庫


參考網站:
http://blog.yam.com/ytha/article/16636287