w180112 wrote:
講到這我就頭痛lib...(恕刪)
「執行」與「編譯」期間的 lib 遺失是兩回事。
編譯期間發生的錯誤訊息不會是「某某 lib 找不到」這麼簡單,
而是「某某 API:Symbol not found」這樣,
這代表 linker 是用靜態方式直接把 lib 編進最後的 bin 檔中。
這時候你該做的就是用 -L 旗標直接把 lib 的路徑餵給 linker。
如果還有問題,那就表示那個 lib 本身在編譯過程中使用了非 X-toolchain 工具,
最常見的 bug 就是 ar。最近我搞 libfastcgi 就發生這種狀況。
而在「執行」過程中跳出「某某 lib 找不到」的訊息,
那就表示 linker 是用動態方式鏈結(講白話文就是 DLL),
是由系統核心在執行的當下去找出對應的 shared lib 然後即時鏈結。
而基本上這就和你 lib 的安裝路徑、lib 放好以後有沒有更新系統資訊,
以及你編譯器設定的預設 root path 等相關。
另外一種可能性就是目前你安裝的 lib 版本不對,其中有一些 API 未實作。
通常在 X-compile 時,
我們會同樣把需要的 library 也 X-compile 成 target 的靜態 lib(.a 檔),
放在編譯器主機端,然後在 X-compile 時採用靜態鏈結。
通常就是 .configure 要加上 --DISABLE_SHARED 旗標,
LDFLAG 也要加上 -static 之類。
這樣可以省下很多麻煩,
尤其是 bin 檔預計會放在不同平台(Ångstrom、Ubuntu、Debian)上執行的時候。
基本上這些都是玩跨平台的基本功。
如果這樣就會搞死人,那你未免太小看軟體開發這項工作了。
當然沒有人天生就會這些,但是絕大部分的狀況你用錯誤訊息去 Google,
都能找到答案。更何況還有 stackexchange.com。
或是想要省事,直接在目標平台上直接用 tarball 開始從頭編譯,以上的問題通通不會發生。
或者,一個整合良好的 IDE,就可以解決以上絕大部分問題。