2015-09-06 7 views
1

Я застреваю, пытаясь понять, почему мои тесты не будут связаны. Я использую Boost.Build и Boost.Test от Boost 1.59 на Ubuntu. Я построил и установил библиотеки boost из исходного кода.Использование Boost.Build и Boost.Test - ошибки компоновщика

Я указываю <library>/boost//unit_test_framework как часть требований к использованию единичного теста. Я понимаю, что для связи с Boost.Test это должно установить все требования к компоновщику.

К сожалению, я получаю кучу ошибок компоновщика для неопределенных ссылок на компоненты Boost.Test даже если команда ссылки с указанием -lboost_unit_test_frameworkпослеtest.o файла.

У меня есть очень простой пример, который демонстрирует описанное поведение:

В 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

даже если команда ссылка с указанием -lboost_unit_test_framework после test.o

Обратите внимание, что при использовании

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

порядок test.o и библиотеки не вопрос: из-за --{start,end}-group, они считаются частью sa me "bookshelf".

Это должно быть что libboost_unit_test.{a,so} делает не предоставляют символы, которые вам нужны. Возможно, он был построен с другой версией g++? (This answer может быть уместным.)

Ваш первый шаг должен состоять в том, чтобы выяснить искаженное имя символов (ов), которые вам не хватает: добавьте -Wl,--no-demangle в свою линию ссылок.

Тогда вы можете убедиться, что вы на самом деле не хватает необходимого символа (ов):

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