2008年12月12日 星期五

編譯與 link (以 iconv.h 為例)

大家應該都知道編譯時通常會透過 pkg-config 來產生 -I 及 -l 的參數
之所以要透過 pkg-config 來產生就是為了解決不同平台其環境可能不同的問題
在最小的衝擊之下的解決之道

編譯流程:
source code(.c) -> object code(.o) -> binary(.exe, +x)

在從 source code -> object code 的過程中,就是轉譯過程,將 source 轉成符號(symbol)
在這個過程中,只要用到 -I 參數,了解其用到的 .h 中的規範
在 object code -> binary 中,才會用到 -l 參數,建立 symbol 的 link

一個有趣的例子:
iconv 是一個編碼轉換的函式,在後來多數的 linux 版本中都已經被系統直接使用
它可能存在 libc6 或 glibc6 的套件中
iconv.h 所提供的方法 iconv_xxx,實際上 libc.so.6 都有提供
因此,大多數的平台在使用到 iconv.h 時,不需要額外加 -l 參數

為何有 libiconv.so?
1. 在 libiconv.so 中提供了更強大的 function,支援比 libc.so.6 更多的編碼
2. 提供自訂化的編碼表
3. 在後期的 libiconv.so 中,為了避免工程師誤用, libiconv.so 中的方法都改為 libiconv_xxx

所以有用到 libiconv_xxx 的才需要 libiconv.so
如果是 iconv_xxx 的,就不需要了

0 回應:

 
TEMPLATE HACKS AND TWEAKS BY [ METAMUSE ] BLACKCAT 1.1