Несоответствие ошибки ссылки на юнит-тестирование Boost abi?

Я пытаюсь создать модульный тест с повышением, но компоновщик жалуется на отсутствующую функцию. Возьмите этот скелетный код

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(TestFuncOps);

BOOST_AUTO_TEST_CASE(CopyConstructor)
{
}    

BOOST_AUTO_TEST_SUITE_END();

Но это не удается с

Undefined symbols for architecture x86_64:
  "boost::unit_test::ut_detail::normalize_test_case_name[abi:cxx11](boost::unit_test::basic_cstring<char const>)", referenced from:
      __GLOBAL__sub_I_funcopstest.cc in funcopstest.o

libboost_unit_test_framework найден моей командой компоновщика:

g++-5 --std=c++14 funcopstest.o -L/usr/local/lib -lboost_unit_test_framework -o test_funcops

потому что, когда я убираю -lboost_unit_test_framework, я получаю массу неопределенных ссылок вместо одной. Boost был установлен через brew из исходников в режиме c++11. Я пытался скомпилировать с каждым -fabi-version=[0-8], но ничего не изменилось.

Кто-нибудь знает, что происходит?


person user1978011    schedule 05.06.2015    source источник
comment
Я думаю, вам нужно связать с монитором выполнения, boost_prg_exec_monitor, по крайней мере, это было моей проблемой однажды.   -  person Klemens Morgenstern    schedule 05.06.2015
comment
@KlemensMorgenstern К сожалению, это не работает. Я также пробовал варианты *-mt.   -  person user1978011    schedule 05.06.2015


Ответы (1)


Добавьте -D_GLIBCXX_USE_CXX11_ABI=0 к вашему CPPFLAGS, затем перекомпилируйте.

libstdc++, поставляемый с gcc 5, должен был внести некоторые изменения в std::string и std::list для соответствия C++11. Для обратной совместимости он поддерживает двойной ABI, но по умолчанию использует новый ABI.

Похоже, что ваш libboost_unit_test_framework.so скомпилирован без поддержки нового (возможно, с gcc 4.x), поэтому при компиляции вашего кода компилятор сгенерирует код, который, как ожидается, будет связан с библиотеками, поддерживающими новый. В случаях, когда два ABI различаются, символы будут отсутствовать. Определение макроса _GLIBCXX_USE_CXX11_ABI как 0 заставляет gcc 5 использовать код старой библиотеки.

В качестве альтернативы вы можете пересобрать Boost.Test с помощью gcc 5.

person Wintermute    schedule 05.06.2015