3

私は autoconf と automake と一緒にブースト unit_test フレームワークの問題に直面しています...

プロジェクトの構造については次のとおりです。

  • ./include/com_i_foo.h
  • ./include/com_foo.h

    ...
    class FooSingleton {
    protected:
    FooSingleton() {}
    private:
    FooSingleton* _instance;
    public:
    virtual ~FooSingleton() {}
    static FooSingleton* getInstance();
    };

    class FooFoo {
    public:
    FooFoo() {}
    virtual uint32_t getSomeInt();
    virtual ~FooFoo() {}
    };
    typedef boost::shared_ptr FooFooPtr_t;
    ...
  • ./include/com_api.h

    #include "com_foo.h"
  • ./include/Makefile.am

    include_HEADERS = \
            com_i_foo.h \
            com_foo.h \
            com_api.h \
            $(NULL)
  • ./src/com_foo.cpp
  • ./src/Makefile.am

    PLATEFORM=LINUX64
    DEBUG_OPTIONS = -g
    DEFINE_OPTIONS=-D${PLATEFORM}
    OPTIONS = -Wall -Werror -shared -O2 $(DEBUG_OPTIONS) $(DEFINE_OPTIONS)

    COMMON_CXXFLAGS= ${OPTIONS} -I$(top_builddir)/include
    ACLOCAL_AMFLAGS = -I ${top_builddir}/m4
    AM_LDFLAGS=

    lib_LTLIBRARIES  = \
            libcom_api.la \
            $(NULL)

    libcom_api_la_SOURCES = com_foo.cpp
    libcom_api_la_CXXFLAGS = ${COMMON_CXXFLAGS}
    libcom_api_la_LDFLAGS =
    libcom_api_la_LIBADD =
  • ./test/Makefile.am

    PLATEFORM=LINUX64
    DEBUG_OPTIONS = -g
    DEFINE_OPTIONS=-D${PLATEFORM} -DBOOST_ENABLE_ASSERT_HANDLER
    OPTIONS = -Wall -Werror -O2 $(DEBUG_OPTIONS) $(DEFINE_OPTIONS)

    BOOST_LIBS = -lboost_unit_test_framework -lboost_locale -lboost_filesystem -lboost_system -lboost_thread

    COMMON_CXXFLAGS= ${OPTIONS} -I$(top_srcdir)/include -I$(top_srcdir)/src
    AM_LDFLAGS=
    ACLOCAL_AMFLAGS = -I ${top_builddir}/m4

    check_PROGRAMS = ut_com_api

    ut_com_api_SOURCES = \
            ut_com_api.cpp \
            $(NULL)
    ut_com_api_CXXFLAGS = ${COMMON_CXXFLAGS}
    ut_com_api_LDFLAGS = -rdynamic
    ut_com_api_LDADD = ${BOOST_LIBS} $(top_builddir)/src/libcom_api.la
  • ./test/ut_com_api.cpp

    #define BOOST_LIB_DIAGNOSTIC
    #define BOOST_TEST_DYN_LINK
    #define BOOST_TEST_MODULE "Common API Unit tests"

    #include 

    #include "com_api.h"

    using namespace boost::unit_test;

    BOOST_AUTO_TEST_SUITE(com_api)

    BOOST_AUTO_TEST_CASE(FooFooTest) {
    FooFooPtr_t myFoo(new FooFoo());
    BOOST_CHECK(myFoo->getSomeInt() == 2);
    }

    BOOST_AUTO_TEST_CASE(FooSingletonTest) {
    FooSingleton* myFoo = FooSingleton::getInstance();
    BOOST_CHECK(myFoo != NULL);
    }

    BOOST_AUTO_TEST_SUITE_END()
  • ./Makefile.am

    SUBDIRS = include src test
    #dist_doc_DATA = README
    ACLOCAL_AMFLAGS = -I m4
  • ./configure.ac

    AC_INIT([com_api], [1.0], [bug@foo.foo])
    AC_CONFIG_MACRO_DIR([m4])
    AM_INIT_AUTOMAKE([-Wall -Werror foreign])
    AC_PROG_LIBTOOL
    AC_PROG_CXX
    AC_LANG_PUSH(C++)
    AX_BOOST_BASE([1.53], ,[AC_MSG_ERROR([You need boost library])])
    AX_BOOST_PROGRAM_OPTIONS
    AX_BOOST_DATE_TIME
    AC_CHECK_HEADER([boost/shared_ptr.hpp], , [AC_MSG_ERROR([You need boost library])])
    AC_LANG_POP(C++)
    AC_CONFIG_HEADERS([config.h])
    AC_CONFIG_FILES([
    Makefile
    include/Makefile
    src/Makefile
    test/Makefile
    ])
    AC_OUTPUT

私の問題:

DLL (Linux では .so) をビルドすると完全に動作しますが、check_PROGRAMS をビルドしようとすると、リンカーは次の未定義の参照を返します。

  • FooSingleton::_instance への未定義の参照
  • 関数 `boost::shared_ptr::operator->() const': boost::assertion_failed への未定義の参照 (char const*, char const*, char const*, long)

FooSingleton については、ビルドした dll とチェック プログラムをうまくリンクしているため、理由がわかりません...

ブーストについては、test/Makefile.am に -lboost_xxxx が欠けていると思いますが、DLL ビルドで完全に動作するのに、check_PROGRAMS のリンカにブースト ライブラリを明示的に指定する必要がある理由がわかりません。 ..

私はどこでも解決策を探しましたが、アイデアが不足しているので、助けていただければ幸いです!

4

1 に答える 1

5

マクロBOOST_ENABLE_ASSERT_HANDLERが何らかの形で定義されているようです。

Boost.Assert のドキュメントに記載されているように、が含まれてBOOST_ENABLE_ASSERT_HANDLERいるときに が定義されている場合、への呼び出しに展開されますが、この関数は実装されていません。ユーザーは実装を提供することが期待されています。<boost/assert.hpp>BOOST_ASSERT(expr)boost::assertion_failed

BOOST_ENABLE_ASSERT_HANDLERcheck_PROGRAMS をビルドするときに何かが定義されているかどうかを確認してください。

于 2013-03-31T23:08:49.510 に答える