發表文章

目前顯示的是 12月, 2008的文章

編譯與 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 的,就不需要了