2013-03-31 14 views
2

我對於autoconf &的automake一起面臨着提升unit_test框架的問題...的Autoconf與升壓試驗 - 連接問題

以下是關於項目結構:

  • ./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) 
  • ./s RC/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], [[email protected]]) 
    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下),它完美的作品,但是當我嘗試建立check_PROGRAMS,鏈接器返回以下未定義的引用:

  • 未定義參考FooSingleton :: _實例
  • 在函數'的boost :: shared_ptr的: :運營商 - >()const的': 未定義的引用,以提高:: assertion_failed(字符常量*,字符常量*,字符常量*長)

關於FooSingleton,我不明白爲什麼,因爲我很好地鏈接我的檢查程序與內置的DLL ...

關於boost,我想我在我的測試/ Makefile.am中缺少-lboost_xxxx,但我不明白爲什麼我必須明確地指定boost lib到鏈接器check_PROGRAMS,而它完美的工作DLL構建...

我到處尋找一個解決方案,但我沒有想法,所以任何幫助將不勝感激!

+0

有一種方法可以定義單例來繞過這個問題,但它仍然很好理解問題: 靜態StatisticManager&getInstance(){ 靜態StatisticManager實例; 返回實例; } 我仍然面臨提升未定義的參考! – Syffys

+0

這裏所有的autotools樣板都有關係嗎?如果是這樣,您可能需要添加標籤,以便熟悉該環境的人員看到此問題。如果沒有,請將代碼縮減爲所需的代碼。我不明白你想要解決什麼問題。 –

+0

我的意圖是儘可能提供足夠的信息來找到問題,但我明白你的觀點。我試圖強調我想要解決的問題,我希望這更容易理解! – Syffys

回答

4

它看起來像宏BOOST_ENABLE_ASSERT_HANDLER不知何故被定義。

the documentation for Boost.Assert所述,如果當包括<boost/assert.hpp>BOOST_ENABLE_ASSERT_HANDLER被定義,則BOOST_ASSERT(expr)膨脹到到boost::assertion_failed一個呼叫,但這個功能未實現;用戶需要提供一個實現。

嘗試查看是否在構建check_PROGRAMS時定義了導致BOOST_ENABLE_ASSERT_HANDLER定義的內容。

+0

非常感謝,你是對的,但是文檔沒有提供任何示例實現... 無論如何thx再次的傢伙! – Syffys

+0

我們的項目顯然有這個定義,但在一個庫中,鏈接器順序非常重要,我需要包含循環庫。謝謝! – sage