2015年6月23日火曜日

C言語でgccを使ったコンパイル④ pkg-configの利用

gccコマンドのディレクトリを参照するための引数は直接入力しようとすると非常に長い場合がある。
さらに、環境によって異なる場合がある。

そこで、コマンド置換を利用したpkg-configが便利

例えばgccの引数として利用する場合、以下のようにバッククオートで囲んでやる。
 gcc xxxx.c `pkg-config --cflags --libs gtk+-3.0`
すると、gccコマンドよりも先にバッククオートで囲まれた部分がコマンドライン上で実行され、その結果が置き換わってgccの引数として利用できる。

前回、恐ろしく長い引数だったのが、これだけで済むのは素晴らしい。
NetBeansのようなIDEを利用している場合にもこれを指定するオプションがあるので、利用すると便利。


引数は
--cflags -I(ヘッダファイル)に対応した引数を返す
--libs  -l(ライブラリ)に対応した引数を返す
を意味している。

gtk+-3.0の部分は.pc ファイル名。
pkg-configは予め登録された拡張子.pc ファイルをもとにして情報を返している。
ライブラリによってはpkg-configに対応しておらず、自動的に.pcが作られない場合もあるためすべてのライブラリで使えるわけではない。

私の場合、拡張子.pcのあるディレクトリを
 sudo find / -name "*.pc" -ls
で確認すると、以下のディレクトリの下でが見つかった。
/usr/share/pkgconfig/
/usr/lib/pkgconfig/
/usr/lib/i386-linux-gnu/pkgconfig/



ちなみにgdk-3.0はここだった。
/usr/lib/i386-linux-gnu/pkgconfig/gdk-3.0.pc
中身は以下の通り。
prefix=/usr
exec_prefix=${prefix}
libdir=/usr/lib/i386-linux-gnu
includedir=${prefix}/include
targets=x11 wayland

gtk_binary_version=3.0.0
gtk_host=i686-pc-linux-gnu

Name: GTK+
Description: GTK+ Graphical UI Library
Version: 3.10.8
Requires: gdk-3.0 atk cairo cairo-gobject gdk-pixbuf-2.0 gio-2.0
Requires.private: atk atk-bridge-2.0 pangoft2 gio-unix-2.0
Libs: -L${libdir} -lgtk-3 
Cflags: -I${includedir}/gtk-3.0 

直接.pcファイルを編集したり、環境変数を変更して参照するディレクトリを変更したりといったこともできるらしい。

pkg-config(今日覚えた呪文)

コマンド置換と言われる方法はバッククオートで囲む以外にも
 $(pkg-config --cflags --libs gtk+-3.0)
としても結果は同じ。こちらの方法ではネストできるのが違うところ。

0 件のコメント:

コメントを投稿