[前へ] [次へ] [目次]


プログラムのコンパイル方法

本章では、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 といった接尾子は省略)。

EB ライブラリ (libeb)
EB ライブラリの本体です。このライブラリは必須です。
zlib (libz)
圧縮と伸長を行うライブラリです (詳しくは @url{http://www.gzip.org/zlib/})。 ebzip コマンドで圧縮した辞書を扱うために使います。 このライブラリは必須です。 EB ライブラリのソースコードには zlib も収録されています。 システムに zlib が インストールされていなければ、EB ライブラリを インストールする際に、zlib も自動的にインストールされます。
gettext ライブラリ (libintl)
メッセージの国際化機能 (NLS) を提供するライブラリです メッセージの国際化機能を有効にして EB ライブラリをコンパイルしている 場合は、必要になるかも知れません。 gettext の実装は何種類かありますが、EB ライブラリで使用できるのは メッセージカタログの形式が GNU gettext 互換のものだけです。 メッセージの国際化機能を有効にしている場合でも、OS の標準 C ライブラリ として glibc を採用しているシステムでは、指定する必要はありません。
iconv ライブラリ
文字コード変換のライブラリです。 gettext ライブラリをリンクする場合、一緒に必要となるかも知れません。 iconv の実装も何種類かあり、OS によっては最初から添付されています。

必要なライブラリファイルの名称を、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 を併用したコンパイル方法

作業の前に、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 ファイル の _LDFLAGSINCLUDES に、次のような値を追加 します。

program_LDFLAGS = $(EBCONF_EBLIBS) $(EBCONF_ZLIBLIBS) $(EBCONF_INTLLIBS)
INCLUDES = $(EBCONF_EBINCS)

(program_LDFLAGSprogram のところは、 アプリケーションプログラムの実際のコマンド名にします。)

EB ライブラリ本体のデバッグ

「自分が作ったアプリケーションが正しく動かないのは、ひょっとすると 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 両方のメッセージを読み捨てずに出力するようになります。


[前へ] [次へ] [目次]