前項まででようやくmakeの準備が整ったはずですので早速テストしてみます。まだ、libcsvの作成がされていなですが、ここまでの作業確認という意味でテストmakeしてみます。手順どおりにconfigureスクリプトを実行します。--with-mysqlのパスはインストール環境によって適時変更してください。(標準的なパスにインストールしていれば--with-mysqlオプションを省略しても正しく見つけられることも確認できるハズです。)
# ./configure --with-mysql=/usr/local/mysql/bin/mysql_config
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
:(略)
configure: creating ./config.status
config.status: creating makefile
config.status: creating config.h
これで、makefileが作成されましたのでmakeを実行します。
# make
make all-am
:
/usr/bin/ld: cannot find -lcsv
collect2: ld はステータス 1 で終了しました
make[1]: *** [sample] エラー 1
コンパイルは成功しましたが、予想どおりリンカがlibcsvを見つけられずエラーになりましたが、とりあえずここまででオブジェクトのビルドができることを確認できました。
ライブラリをビルドする手順も基本的にはこれまでの流れと同じようにautoconf/automakeを用いて作成していきます。
# cd libcsv
# autoscan
# mv configure.scan configure.ac
configure.acを編集します。ここでもautomakeを使う前提ですのでAM_INIT_AUTOMAKEマクロを指定、AC_CONFIG_FILES([makefile])マクロを追加します。
AC_INIT(libcsv, 1.0, bugs@example.com)
AM_INIT_AUTOMAKE
:
AC_CONFIG_FILES([makefile])
ビルド用のmakefile.amも作成します。今度はライブラリのビルド指定ですから、前項のプログラム用の記述とは少し違いがあります。
まず、プライマリの指定がLIBRARIESになります。接頭辞にはインストールディレクトリを指定しますが、今回のようにスタティックライブラリとしてアプリケーション本体にリンクしてしまう場合はインストールの必要がありませんので、インストールしないことを示す接頭辞noinstを使用します。共有ライブラリを作成する場合は適切な接頭辞を使用してください。また、ターゲットの名称はlibcsv.aですが、この名称を変数として使用する場合は命名規約(英数字・@・アンダーバー以外の文字はアンダーバーに変換)に沿って変換が必要になります。
noinst_LIBRARIES=libcsv.a
libcsv_a_SOURCES=ccsv.cpp ccsv.h
libcsv_a_LIBADD=ccsv.o
アーカイブに含むオブジェクトはLIBADDで指定します。
makefile.amを作成しましたのでautomakeを実行します。スタティックライブラリを作成するmakefileを作成するだけですから、READMEなどのドキュメントは不要ですので--foreginオプションを使用して実行します。
# aclocal
# automake --foreign -a -c
makefile.am:1: library used but `RANLIB' is undefined
makefile.am:1:
makefile.am:1: The usual way to define `RANLIB' is to add `AC_PROG_RANLIB'
makefile.am:1: to `configure.ac' and run `autoconf' again.
RANLIBが定義されていないというエラーがでます。automakeを利用してライブラリを生成する場合、makeの最後にranlibの実行が必須となります。メッセージに従ってconfigure.acにAC_PROG_RANLIBマクロを追加してやり直しをします。
# tail -2 configure.ac
AC_PROG_RANLIB
AC_OUTPUT
# autoconf
# automake --foreign -a -c
これでmakefile.inが生成されましたので、いよいよライブラリを作成します。
# ./configure
# make
:(略)
ar cru libcsv.a ccsv.o ccsv.o
ranlib libcsv.a
めでたくlibcsv.aがビルドされましたので、再度アプリケーション本体のビルドを行います。
# cd ../
# make
g++ -g -O2 -o sample sample-mysqlbase.o sample-tblsample.o\
sample-main.o\
-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L./libcsv -lcsv
ようやくビルドすることができました。