2015-09-06 57 views
1

我被困在試圖找出爲什麼我的測試不會鏈接。我在Ubuntu上使用Boost 1.59中的Boost.Build和Boost.Test。我從源代碼構建並安裝了boost庫。使用Boost.Build和Boost.Test - 鏈接器錯誤

我指定<library>/boost//unit_test_framework作爲單元測試使用要求的一部分。我的理解是,這應該設置所有的鏈接器要求,以便與Boost.Test鏈接。

不幸的是,我得到未定義的引用鏈接錯誤的堆如Boost.Test組件即使鏈接命令的test.o文件後指定-lboost_unit_test_framework

我有一個非常簡單的例子,顯示出所描述的行爲:

Jamroot

if $(BOOST_ROOT) 
{ 
    use-project /boost : $(BOOST_ROOT) ; 
} 

import boost ; 
boost.use-project ; 

using testing ; 

unit-test test 
    : test.cpp 
    : <library>/boost//unit_test_framework 
    ; 

test.cpp

#define BOOST_TEST_MODULE test 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_CASE (pass) { 

} 

運行b2 -d+2給我的編譯和鏈接器的命令是被使用。

$ b2 -a -d+2 
gcc.compile.c++ bin/gcc-4.9.2/debug/test.o 

    "g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -g -std=c++11 -fPIC -DBOOST_ALL_NO_LIB -DBOOST_TEST_DYN_LINK -c -o "bin/gcc-4.9.2/debug/test.o" "test.cpp" 

gcc.link bin/gcc-4.9.2/debug/test 

    "g++" -o "bin/gcc-4.9.2/debug/test" -Wl,--start-group "bin/gcc-4.9.2/debug/test.o" -Wl,-Bstatic -Wl,-Bdynamic -lboost_unit_test_framework -Wl,--end-group -g 

bin/gcc-4.9.2/debug/test.o: In function `__static_initialization_and_destruction_0(int, int)': 
/home/anthony/Development/example/test.cpp:4: undefined reference to `boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, boost::unit_test::decorator::collector&, unsigned long)' 
bin/gcc-4.9.2/debug/test.o: In function `boost::unit_test::make_test_case(boost::function<void()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long)': 
/usr/local/include/boost/test/tree/test_unit.hpp:249: undefined reference to `boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::function<void()> const&)' 
collect2: error: ld returned 1 exit status 
...skipped <pbin/gcc-4.9.2/debug>test.passed for lack of <pbin/gcc-4.9.2/debug>test... 
...failed updating 1 target... 

回答

1

即使鏈接命令在test.o後指定-lboost_unit_test_framework

注意,與使用

-Wl,--start-group ...test.o -lboost_unit_test_framework -Wl,--end-group 

test.o順序和庫不是問題:因爲--{start,end}-group,它們被認爲是sa的一部分我「bookshelf」。

必須是該libboost_unit_test.{a,so}提供你所需要的符號。也許它是用g++的不同版本構建的? (This answer可能是相關的。)

你的第一步應該是找出你失蹤的符號的損壞名稱:將-Wl,--no-demangle添加到你的鏈接。

然後你可以驗證你實際上缺少必要的符號(S):

nm -A libboost_unit_test.* | grep missing_mangled_symbol 

最後,你需要了解爲什麼您缺少的象徵。是否有類似但略有不同的符號定義?這個命令可以提供一些線索:

nm -AC libboost_unit_test.* | grep 'boost::unit_test::test_case::test_case' 

更新:

我剛剛發現,不僅版本的g++問題在這裏,但也編譯標誌。試想一下:

// foo.cc 
#include <string> 
void foo(const std::string &) { } 

// t.cc 
#include <string> 
void foo(const std::string &); 
int main() { std::string s; foo(s); } 

使用GCC近期主幹:

g++ -c t.cc foo.cc 
g++ t.o foo.o # success 

g++ -D_GLIBCXX_USE_CXX11_ABI=0 t.cc foo.o 
/tmp/ccKqZVvh.o: In function `main': 
t.cc:(.text+0x1d): undefined reference to `foo(std::string const&)' 
collect2: error: ld returned 1 exit status