Next: , Previous: Multiple Options, Up: Top


8 getopt_longが利用できない場合どうするの?

コマンドライン引数を構文解析するCの関数を生成するためgengetoptを使用し ている場合,これらの生成された関数が,実際にコマンドラインを読み込み, それを構文解析するために,getopt_longを使用していることを知って おく必要があります.この関数は,通常標準Cライブラリの一部ですが,実装に よっては含まれていない可能性があります.しかし,これは問題にはなりませ ん.我々は,getopt_long関数を実際に実装しているCのファイルを提供してい ます.getopt.cgetopt1.cそしてgnugetopt.hです.こ れらのファイルは,<install prefix>/share/gengetoptディレクトリで 見つかり,<install prefix>はコンパイル時に指定したものになります. プレフィクスを指定しなかった場合は/usr/localがデフォルトです.バ イナリ形式のgengetoptをダウンロードした場合,プレフィクスは /usr/localまたは/usrになります.

gnugetopt.hgetopt.hに名前を変更し,これらのファイルをコ ンパイルし,プログラムの実行形式にリンクすることが可能です.しかし, automakeとautoconfを使用している場合,より簡潔な解決方法があります.以 下のURLからマクロをダウンロードしてください.

http://www.gnu.org/software/ac-archive/m4source/adl_func_getopt_long.m4

そして,acinclude.m4にそれを追加して下さい.このマクロは, gengetoptのソースのacinclude.m4にもあります.

このマクロはgetopt_long関数がCライブラリかどうかを調査し,そうでない場 合はgetopt.ogetopt1.oを実行形式にリンクするオブジェクト ファイルに追加します(LIBOBJS).

そして,ソースディレクトリのMakefile.amで,LIBOBJSの内容 に,getopt_longを使用する必要があるプログラムのLDADDを追加する必 要があります.例えば,プログラムfooがgetopt_longを使用する必要が ある場合,以下の行を追加する必要があります.

     foo_LDADD = @LIBOBJS@

さて,これらのファイルはコンパイルされ,必要がある場合だけプログラムに リンクされます.

更に,getopt.cgetopt1.c,そしてgnugetopt.hを配布 物に追加する必要があります.これらのファイル名をfoo_SOURCESの中 身に書く必要はありませんが,gnugetopt.hEXTRA_DISTに追加 する必要があります.

     EXTRA_DIST = gnugetopt.h

gengetoptのconfigure.insrc/Makefile.amを見てみると良い でしょう.それらは両方とも,ここで記述しているテクニックを使用していま す.