2009/02/19

library...

什麼是library(函式庫)?
在了解這件事情之前
要先知道編譯的過程
abc.c的檔案
先經過編譯(compile)的過程
變成"目標檔" abc.o
再透過連結(link)的過程
變成可以執行的檔案 abc.exe

但是有很多的固定常用的程式碼
不需要每次用都compiler
可以先將這些程式碼compile好
放到某個檔案中
而這些檔案就是library
在需要用到的時候
在link階段在連結進來就好了
就不需要費工去compile

library一共分為三類
● 靜態函式庫
在link階段的時候直接link到執行檔中
通常都是*.a的檔案格式
*.a的檔案格式說穿了也就是打包了一堆的"目標檔"(*.o)
● 共享函式庫
在執行檔執行的時候在載入
在link階段僅需指定library function
通常都是*.so的檔案格式(舊的檔案格式為*.sa)
常常在執行某個執行檔時遇到下面的Error時
"xxxx fatal: yyyy.so.0.9.8: open failed: No such file or directory"
就是代表在執行時找不到某個"共享函式庫"
解決的方法就是
"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`library所在的目錄`"
● 動態函式庫
類似共享函式庫
在執行檔執行到這段程式碼的時候才載入
在程式碼用完之後也可以釋放空間
有點類似window的*.dll

通常library的檔案名稱如下
libm.so.5
lib:指的是library
m:實際的名稱
so:檔案格式
5:版本

若是要在compiler加入某個library要怎麼做呢?
Unix預設將library放在/usr/lib/以及/lib裡面
若是要用這裡面的libm.so.5就直接如下
"gcc main.c -o -lm"
-l代表要使用的library的名稱 (libm.so.5的名稱為"m")
若要使用的library不在上述的地方
像是要使用/usr/local/netsnmp/lib裡面的libnetsnmp.a
可以用下面兩種作法
方法1:
"gcc main.c -o -L/usr/local/netsnmp/lib/ -lnetsnmp"
-L指要使用的library的資料夾
用了-L才能用-l的library Name
方法2:
"gcc main.c -o /usr/local/netsnmp/lib/libnetsnmp.a"
直接給路徑就好了

沒有留言:

張貼留言