LoginSignup
4
5

More than 5 years have passed since last update.

C++ のライブラリチェックを configure.ac (or configure.in) で書く方法

Last updated at Posted at 2015-12-15

試してみると C++ の場合は AC_CHECK_LIB が使えないので辛い。
そこで,ライブラリチェックを行う別な方法を考える必要があります。
例えば boost_system に依存している時の書き方を以下で考えてみます。

自前でプログラムを作ってみてチェック

http://nerdland.net/2009/07/detecting-c-libraries-with-autotools/ で Solution Two として紹介されている方法です。

AC_LANG_PUSH([C++])
[SAVED_LIBS=$LIBS]
[LIBS="-lboost_system $LIBS"]
AC_MSG_CHECKING([libboost_system])
AC_LINK_IFELSE(
  [AC_LANG_PROGRAM([#include <boost/system/error_code.hpp>],
    [boost::system::error_code err])],
  [AC_MSG_RESULT([yes])]
  [HAVE_LIBBOOST_SYSTEM=1]
  [SAVED_LIBS="$LIBS"],
  [AC_MSG_RESULT([no])])
LIBS="$SAVED_LIBS"
AC_LANG_POP()

上記コードは AC_CHECK_LIB の挙動に近づけるために元のコードに少しばかり修正を加えています。
このままだと再利用性が悪いので,m4マクロを使って使いやすくしてあげましょう。

AC_DEFUN([CXX_CHECK_LIB],[
AC_LANG_PUSH([C++])
[SAVED_LIBS=$LIBS]
[LIBS="-l$1 $LIBS"]
AC_MSG_CHECKING([lib$1])
AC_LINK_IFELSE(
    [$2],
    [AC_MSG_RESULT([yes])]
    [HAVE_LIB]m4_translit($1, [a-z], [A-Z])[=1]
    [SAVED_LIBS="$LIBS"],
    [AC_MSG_RESULT([no])])
[LIBS="$SAVED_LIBS"]
AC_LANG_POP()])

CXX_CHECK_LIB([boost_system],
[AC_LANG_PROGRAM([#include <boost/system/error_code.hpp>],
[boost::system::error_code err])])

CXX_CHECK_LIB の第1引数にライブラリの名前,第2引数にチェック用のプログラムを渡せばOKです。やっていることもシンプルですから改造もし易いのではないでしょうか。

配布されているマクロを使う方法

http://ac-archive.sourceforge.net/guidod/ax_cxx_check_lib.html のマクロを使うのも良さそうです。
最初の方法より洗礼されていそうですが,私はまだ使っていませんので使い勝手についてはノーコメントで。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5