2013年10月18日 星期五

pkg-config & cross compiling

別人寫得, 先紀錄一下.
reference: http://dabod.blogspot.tw/2009/06/pkg-config-cross-compiling.html

想成功的 build open source package, 一定要先搞清楚 pkg-config.

支援的 pkg-config 的 package 在安裝時會將 .pc 檔裝到 /usr/lib/pkgconfig 目錄中 (當然, 這些是指 host 端的 package), 裡面包含了有 package 的版本, header files 所在目錄, libraries 所在目錄, 相依的其他 package 名稱...可用指令 pkg-config 來 query.

使用法就不說明了, 看文件應該很容易懂才是.

在網上常看到有人在問:
build XXX package 時 pkg-config 一直說找不到 OOO, 明明就有裝呀, 怎麼....
build XXX package 時 pkg-config 一直說 OOO 的版本小於 mm.nn, 明明就是 aa.bb 呀, 怎麼....

在 cross compiler 時, 我們是不會把 build 好的 package 放在跟 host 一樣的目錄的 (不然, 同名的 file 相互 overwrite, 那 host 以後肯定出問題). 所以, 想當然爾, pkg-config 回報的 package 路徑也會不同於 native build. 上面那個找不到/版本跟預期不同的問題, 情況通常是沒有將給 target 用的 package 安裝路徑提供給 pkg-config.

怎麼給呢? "man pkg-config" 一下
PKG_CONFIG_PATH
A colon-separated (on Windows, semicolon-separated) list of
directories to search for .pc files. The default directory will
always be searched after searching the path; the default is lib‐
dir/pkgconfig:datadir/pkgconfig where libdir is the libdir where
pkg-config and datadir is the datadir where pkg-config was
installed.
PKG_CONFIG_LIBDIR
Replaces the default pkg-config search directory.

這就是答案了, 如果你的 package 是裝在
/home/cross_root
那應該可以找到
/home/cross_root/usr/lib/pkgconfig
那麼, 請把上面兩個環境變數都指向這個目錄, 例如
$ export PKG_CONFIG_PATH=/home/cross_root/usr/lib/pkgconfig
$ export PKG_CONFIG_LIBDIR=${PKG_CONFIG_PATH}

另一種比較建議的做法是, 寫個 shell script 將它包起來, 檔名要加上 target 平台的 prefix. 例如你的 target 是 arm-elf, 那 wrapper script 的檔名就叫 arm-elf-pkg-config, 內容如下
$ echo 'PKG_CONFIG_PATH=/home/cross_root/usr/lib/pkgconfig PKG_CONFIG_LIBDIR=/home/cross_root/usr/lib/pkgconfig pkg-config $@' > /usr/bin/arm-elf-pkg-config

存檔後, 在要 cross compile 時要確定這個 scrript 所在路徑有被加到 PATH 中, 這樣 configure 找 package 的動作就會正常了.

另外, 有些 package 在安裝 .a 檔時還會附上 .la 檔, 裡面也是一些 package/libraries 的 path. 曾經碰過一個問題, configure 時找得到 glib-2.0, 但 build 時會報錯, 因為 build 出來的執行檔或 library 中有一堆外部 symbol 找不到, 而那些 symbol 都是屬於 glib-2.0 的. 仔細看了一下 link command, 沒找到 libglib-2.0.a 在其中, 就試著執行
$ pkg-config --cflags glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
看起來正常, 但下面的卻列出空的 library 列表
$ pkg-config --libs glib-2.0
那時沒經驗, 找了一天, 才發現原來是因為我執行 make install 後, 會再將結果搬到另一個目錄, 我當下很聰明的改了 .pc 檔, 但不知道要改 .la 檔, 所以 pkg-config 在 parse library 資訊時就給了錯的結果. 改了 .la 檔後就一切正常了

沒有留言:

張貼留言