本章では、EB ライブラリを利用したプログラムのコンパイルの仕方について、 2 通りの方法を説明します。
一つ目は、ごく私的な、小規模のプログラムをコンパイルする際に向いている てっとり早くコンパイルするための方法です。 EB ライブラリの使い方を覚える目的で簡単なプログラムを組む際は、こちら が良いでしょう。
二つ目は、EB ライブラリを組み込んだアプリケーションをフリーソフトウェア としてリリースする際に向いている方法です。 EB ライブラリには、GNU Autoconf, Automake, Libtool を併用する仕組みを 用意してありますので、これらを使ったコンパイル方法について説明します。
アプリケーションプログラムをコンパイルする際は、ヘッダファイルの ディレクトリ位置を C コンパイラに教えてやる必要があるかも知れません。 一般に UNIX の C コンパイラでは、-I オプションで位置を指定 します。
cc -I/usr/local/include -c sample.c
/usr/local/include/eb
ではなく、その一つ上を指定します
(「ヘッダファイル」 を参照のこと)。
次に、リンクして実行バイナリを生成する工程ですが、
以下に記したライブラリの一部、もしくは全部をリンクします。
括弧内は、ライブラリのファイル名です (ただし、.a
や
.so
といった接尾子は省略)。
ebzip
コマンドで圧縮した辞書を扱うために使います。
このライブラリは必須です。
EB ライブラリのソースコードには zlib も収録されています。
システムに zlib が インストールされていなければ、EB ライブラリを
インストールする際に、zlib も自動的にインストールされます。
必要なライブラリファイルの名称を、C コンパイラに指定してやります。 加えて、ファイルの置かれているディレクトリ位置を、C コンパイラに教える 必要があるかも知れません。 一般に UNIX の C コンパイラでは、-L オプションでディレクトリ 位置を指定し、-l オプションでライブラリのファイル名を指定 します。
cc sample.o -L/usr/local/lib -leb -lz -lintl -liconv
ただし、共有ライブラリをリンクする場合は、実行時におけるライブラリの 検索パスも合わせて指定する必要があるかも知れません。
cc sample.o -R/usr/local/lib -L/usr/local/lib -leb -lz -lintl -liconv
C コンパイラの使い方に関しての詳細は、C コンパイラのマニュアルを参照 して下さい。
作業の前に、Autoconf, Automake, Libtool は、あらかじめインストールして おいて下さい。 Autoconf はバージョン 2.50 以降が必要です。
まず、アプリケーションプログラムの configure.ac
(もしくは configure.in
) に、次の行を加えます。
eb_LIB_EB4
マクロ eb_LIB_EB4
は、EB ライブラリの使用に必要な一切の
チェックを行い、さらに configure
に次のオプションを追加
します。
--with-eb-conf=FILE eb.conf file is FILE [SYSCONFDIR/eb.conf]
eb.conf
は、EB ライブラリをインストールしたときの情報を記録
したファイルで、ライブラリと一緒にインストールされます。
eb_LIB_EB4
はこのファイルを読み込んで、C コンパイラに
渡さなければいけないオプションなどの情報を得ます。
--eb-conf-file は、eb.conf
のファイル名を
明示的に指定するオプションです。
マクロ eb_LIB_EB4
は、eb4.m4
というファイルで
提供されています。
EB ライブラリを /usr/local
にインストールし、個々のファイル
のインストール先を変更していなければ、/usr/local/share/aclocal
にインストールされます。
この eb4.m4
をソースコードの適当なディレクトリの下 (たとえば
m4
) にコピーして下さい。
aclocal
コマンドで aclocal.m4
を再生成する際は、
-I オプションでマクロファイルのディレクトリを指定します。
aclocal -I m4
加えて、トップディレクトリの Makefile.am
の中にも
aclocal
へ渡すオプションを書いておきます。
ACLOCAL_AMFLAGS = -I m4
また、ソースコードのディレクトリに Libtool パッケージがまだ用意されて
いなければ、用意します。
libtoolize
コマンドを実行して下さい。
Libtool パッケージが、ソースコードのディレクトリにコピーされます。
libtoolize
最後に、コンパイルを行うディレクトリの Makefile.am
ファイル
の _LDFLAGS
と INCLUDES
に、次のような値を追加
します。
program_LDFLAGS = $(EBCONF_EBLIBS) $(EBCONF_ZLIBLIBS) $(EBCONF_INTLLIBS) INCLUDES = $(EBCONF_EBINCS)
(program_LDFLAGS
の program
のところは、
アプリケーションプログラムの実際のコマンド名にします。)
「自分が作ったアプリケーションが正しく動かないのは、ひょっとすると EB ライブラリのバグが原因ではないか?」という疑問を抱き、EB ライブラリ の挙動を確認したいと思うことがあるかも知れません。
そのような場合は、環境変数 EB_DEBUG
をセットした状態で
アプリケーションを実行してみて下さい。
EB ライブラリは標準エラー出力に、次のようなログを (かなり大量ですが)
出力するようになります。
[EB] in: eb_set_font(book=0, font_code=0) [EB] in: eb_load_narrow_font(book=0) [EB] out: eb_load_narrow_font() [EB] in: eb_load_wide_font(book=0) [EB] out: eb_load_wide_font() [EB] out: eb_set_font() = EB_SUCCESS
これらのログは、関数の呼び出し時の引数列、および関数からの戻り値を
示しています。
ebfixlog
という Perl5 スクリプトを使うと、ログを整形すること
ができます。
このスクリプトは、EB ライブラリのソースコードの misc
ディレクトリに収められています。
ebfixlog
は、コマンド行の引数として与えられたファイル
(引数が指定されなければ標準入力) からメッセージデータを読み込み、
次のように字下げして出力します。
[EB] in: eb_set_font(book=0, font_code=0) [EB] in: eb_load_narrow_font(book=0) [EB] out: eb_load_narrow_font() [EB] in: eb_load_wide_font(book=0) [EB] out: eb_load_wide_font() [EB] out: eb_set_font() = EB_SUCCESS
通常 ebfixlog
スクリプトは、zio および ebnet と呼ばれる、
EB ライブラリでファイル入出力を受け持つ処理部のログは読み捨てるように
なっています。
これにより、ログの量がかなり減ります。
zio は EB ライブラリの低レベル入出力の処理部で、頻繁に呼び出されます。 問題の原因を調べる際も、まずは読み捨てた方がライブラリの内部動作を追跡 しやすいでしょう。
ebfixlog
の -z オプションを使うと、zio の
メッセージを読み捨てずに出力するようになります。
ebnet は遠隔アクセスの入出力を処理する部分で、zio よりもさらに 下位レベルに位置します。 遠隔アクセスの挙動を追跡するとき以外は、読み捨てた方が良いと思います。
ebfixlog
の -n オプションを使うと、ebnet,
zio 両方のメッセージを読み捨てずに出力するようになります。