「.conf」といった設定ファイルを読める機能をC++で実装したくて、GLibというライブラリを使うことにした。
とにかくやたらと機能満載なライブラリで、しかもクロスプラットフォーム。ちなみに現在行っているのはクロス開発。
で、これを利用しようとすると、次から次に壁が立ち上がる。
[cpp language=”gutter:false;”]
#include <glib.h>
[/cpp]
↓
[bash language=”gutter:false;”]
fatal error: glib.h: No such file or directory
[/bash]
「/usr/include/glib-2.0」こんなところにインクルードパスを通す必要があるようだ。
関連サイト
しかし、Glibhが参照するヘッダファイル「glibconfig.h」が見つからないと言われる。
さらに「/usr/lib/glib-2.0/include」にインクルードパスを通す。
関連サイト
現在、NetBeansで開発を行っているため、こんな感じになった。
しかし、コンパイルは何とかなるが、リンク時にまた壁。
[bash language=”gutter:false;”]
g++ -o 中略 -lglib
[/bash]
↓
glib内の関数がことごとく実態無しエラー。
ここで、今回のクロス開発でとてもお世話になっている下記サイトであるキーワードを発見。
関連サイト
GLibを使う時は、Makefileにも注意する必要があります。GLib用のヘッダファイルやライブラリファイルは、標準Cライブラリ向けのものとは違う特別なディレクトリに配置されるため、これをgccに教えてあげなくてはならないのです。それらがどこにあるかわかれば、適切にMakefileに設定してgccに渡るようにすれば良いのですが、ATDEにも入っているpkg-configというツールを使ってこれを簡略化できます。
「pkg-config」!?そう思ってNetBeansのプロジェクト・プロパティを見たら、
「PkgConfigライブラリ」という項目と、「glib-2.0」が!
ここでライブラリ選択すると、 なんとインクルードパスまで作成され、コンパイル→リンクが完了します。
コンパイル時:
[bash language=”gutter:false;”]
g++ -c -O2 `pkg-config –cflags glib-2.0` 中略 -o XXX.o XXX.cpp
[/bash]
`pkg-config –cflags glib-2.0`→「-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include」
リンク時:
[bash language=”gutter:false;”]
g++ -o XXX XXX.o XXX.o `pkg-config –libs glib-2.0`
[/bash]
`pkg-config –libs glib-2.0`→「-lglib-2.0」
で、クロスコンパイルして、組み込みLinuxBoxにコピーし動作しました。やったー。
しかし、ちょっと気になることが。
[bash language=”gutter:false;”]
$ sudo find / -name pkgconfig -print
/usr/lib/pkgconfig
/usr/arm-linux-gnueabi/lib/pkgconfig
/usr/arm-linux-gnueabi/share/pkgconfig
/usr/share/pkgconfig
[/bash]
となっており、どうもpkg-configコマンドが参照する定義ファイルが複数あります。
中を見てみると、
/usr/lib/pkgconfig/glib-2.0.pc
[bash language=”gutter:false;”]
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: GLib
Description: C Utility Library
Version: 2.24.2
Libs: -L${libdir} -lglib-2.0
Libs.private:
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include
[/bash]
/usr/arm-linux-gnueabi/lib/pkgconfig/glib-2.0.pc
[bash language=”gutter:false;”]
prefix=/usr/arm-linux-gnueabi
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: GLib
Description: C Utility Library
Version: 2.24.2
Libs: -L${libdir} -lglib-2.0
Libs.private:
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include
[/bash]
この2つがコンパイル・リンク時に切り替わったほうが望ましい(たぶん情報は一緒なんだろうけど)。
これには、
- クロス環境用のpkg-configが別のバスにあり、それぞれの環境の定義ファイルを参照し適切な情報を返す。
- pkg-configコマンドはPKG_CONFIG_PATH環境変数中のConfigファイルを参照し、応じた情報を返す。
等の方法があるようだが、NetBeansの「ツール・コレクション」という機能で、開発機ビルド・クロスビルドを切り替えている現状、良案がない。
一応、関連サイト
しかし、組み込みLinuxの開発がこんなにつっかえるものとは思ってなかったなぁ。・・・いやLinuxでの開発の無知か・・・。