まず、pkg-config で何ができるかを学びましょう。 Wikipedia には pkg-config について次のような記載があります:
pkg-config は、ソース コードからソフトウェアをコンパイルするときに、インストールされているライブラリをクエリするための統合インターフェイスを提供するコンピューター ソフトウェアです。 pkg-config は元々 Linux 用に設計されましたが、現在では BSD、Windows、Mac OS X、Solaris のさまざまなバージョンで利用できるバージョンがあります。
簡単に言えば、pkg-config は主に次の機能を提供します:
1. ライブラリのバージョン番号を確認します。必要なライブラリのバージョンが要件を満たしていない場合は、間違ったバージョンのライブラリ ファイルがリンクされるのを避けるためにエラー メッセージが出力されます。
2. マクロ定義やヘッダー ファイルの場所などのコンパイル前処理パラメータを取得します。
3. ライブラリやその他の依存ライブラリの場所、ファイル名、その他の接続パラメータなどのリンク パラメータを取得します。
4. 依存する他のライブラリの設定を自動的に追加します。
最近、opencv を使用して画像をトリミングするための php 拡張機能を開発しました。 Opencv は多くのライブラリをロードする必要があり、それらを手動で config.m4 に追加するのは非常に面倒で、ポストメンテナンスを活用できません。幸いなことに、opencv には opencv.pc ファイルが用意されているため、pkg-config を使用してコンパイル済みパラメータを自動的に取得できます。
以下は、opencv 関連の so ライブラリとヘッダー ファイルを自動的にロードするために config.m4 に書いたコードです。
dnl # --with-tclip -> check with-path SEARCH_PATH="/usr/lib/pkgconfig" # 定义pkgconfig文件,即扩展名pc文件存放路径 SEARCH_FOR="opencv.pc" # 要寻找的文件 if test -r $PHP_TCLIP/$SEARCH_FOR; then # TCLIP_DIR=$PHP_TCLIP else # search default path list AC_MSG_CHECKING([for tclip files in default path]) for i in $SEARCH_PATH ; do if test -r $i/$SEARCH_FOR; then TCLIP_DIR=$i AC_MSG_RESULT(found in $i) fi done fi dnl if test -z "$TCLIP_DIR"; then AC_MSG_RESULT([not found]) AC_MSG_ERROR([Please reinstall the tclip distribution]) fi OPENCV_FLAGS="`pkg-config opencv --libs --cflags opencv`" for i in $OPENCV_FLAGS;do if test ${i:0:2} = "-I" ;then PHP_ADD_INCLUDE(${i:2}) elif test ${i:${#i}-3} = ".so" ;then dir_name=`dirname $i` file_name=${i/$dir_name/} file_name=${file_name/\/lib/} file_name=${file_name/.so/} PHP_ADD_LIBRARY_WITH_PATH($file_name,$dir_name,TCLIP_SHARED_LIBADD) fi done
注:
if の条件部分で中括弧を使用しないでください。そうしないと、m4 によって生成された makefile で構文エラーが発生します。
参考資料
http://www.chenjunlu.com/2011/03/ Understanding-pkg-config-tool/ 「pkg-configツールについて」
http://www.php.net/manual/zh/internals2 .buildsys.configunix.php "UNIX ビルド システムとの対話: config.m4"