12

私は GNU/Linux で C++ プロジェクトに取り組んでおり、Autotools を使用して IBM Informix のライブラリの存在と使いやすさをテストする方法、つまりconfigure.in. 私は Autotools の経験がないので、基本的にはプロジェクトのconfigure.in et al. から拾っています。スクリプトと、変更が必要だと感じる場所のコピーと変更。IOW、私は の既存のテキストから適応してきましたconfigure.in

これまでのところ、特定のライブラリが存在し、使用可能かどうかをテストするためAC_CHECK_LIBに inをうまく使用してきました。configure.inしかし、これはクラスなどではなく、関数を持つライブラリでのみ機能するようです。つまり、これは Informix のlibifc++.soライブラリをテストするときに失敗します。

AC_CHECK_LIB(ifc++, ITString, 
        INFORMIX_LIB="-L$INFORMIX_LIB_LOCATION/c++ -lifc++ -L$INFORMIX_LIB_LOCATION -L$INFORMIX_LIB_LOCATION/dmi -L$INFORMIX_LIB_LOCATION/esql -lifdmi -lifsql -lifasf -lifgen -lifos -lifgls -lifglx $INFORMIX_LIB_LOCATION/esql/checkapi.o -lm -ldl -lcrypt -lnsl",
        echo "* WARNING: libifc++.so not found!"
        INFORMIX_INC=""
        INFORMIX_LIB=""
)

ITString::ITStringなどの他の組み合わせも試しました。

Informix の API に「純粋な」関数 (つまり、C++ クラスでコンテキスト化されていない関数) は見つかりませんでした。AC_CHECK_LIBしたがって、このコンテキストで使用する方法があるか、この特定の用途のための別のautoconf/ configure.in「コマンド」があることを願っています。

フィードバックをお寄せいただきありがとうございます。

4

4 に答える 4

17

あなたは autotools の欠点を発見しましたが、これはどうしようもありません。Autotools はライブラリ バイナリ内のシンボル名をチェックします。関数のシンボル名が関数名と同じである C とは異なり、C++ は関数のシンボル名を「マングル」して、関数のオーバーロードなどを実現します。さらに悪いことに、C++ には「標準」のマングリング規則さえないため、C++ コンパイラが異なれば、同じ関数に対して異なるシンボル名が生成される可能性があります。したがって、autotools は信頼できる方法で C++ シンボル名をチェックできません。

使用しようとしているライブラリには、で宣言されている関数がありextern "C"ますか? これにより、C++ コンパイラは標準化された C スタイルのシンボル名を生成し、autotools はそれらを見つけることができます。

Autotools を使用してgtestgmock (Google のユニット テストとオブジェクト モッキング フレームワーク)を検出しようとして、この問題に遭遇しました。

# gtest has a main function in the gtest_main library with C linkage, we can test for that.
AC_CHECK_LIB([gtest_main], [main], [HAVE_GTEST=1] [TEST_LIBS="$TEST_LIBS -lgtest_main"], 
      AC_MSG_WARN([libgtest (Google C++ Unit Testing Framework) is not installed. Will not be able to make check.])) 

# gmock has no functions with C linkage, so this is a roundabout way of testing for it. We create a small test
# program that tries to instantiate one of gmock's objects, and try to link it with -lgmock and see if it works.
if test "$HAVE_GTEST"                                                                 
then                                                                                  
  saved_ldflags="${LDFLAGS}"                                                          
  LDFLAGS="${LDFLAGS} -lgtest -lgmock"                                                
  AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <gmock/gmock.h>], [testing::Cardinality dummy])],
    [TEST_LIBS="$TEST_LIBS -lgmock"] [HAVE_GMOCK=1],                                           
    [AC_MSG_WARN([libgmock (Google C++ Object Mocking Framework) is not installed. Will not be able to make check.])])
  LDFLAGS="${saved_ldflags}"                                                                                          
fi          
于 2009-06-20T16:48:26.830 に答える
3

チェックしているライブラリがpkg-configをサポートしている場合、これは非常に簡単になります。configure.inをチェックして有効にするためgtestに追加したのは次のgmockとおりです。

dnl ************************************
dnl Check for googletest and googlemock
dnl ************************************

PKG_CHECK_MODULES(gtestmock, libgtest >= 0.4.0, libgmock >= 0.4.0)
AC_SUBST(gtestmock_LIBS)
AC_SUBST(gtestmock_CFLAGS)

そして、私のMakefile.amどこかで:

sometarget_CXXFLAGS = $(gtestmock_CFLAGS) $(AM_CXXFLAGS)
sometarget_LDADD    = $(gtestmock_LIBS)

かなり些細なことですよね?

于 2010-03-24T08:31:16.883 に答える
0
AC_LANG_CPLUSPLUS
AC_CHECK_LIB(Sockets, main)

Caveat: http://lists.gnu.org/archive/html/autoconf/2006-09/msg00019.html

于 2012-08-02T13:28:06.427 に答える