Как решить ошибки компоновщика UnitTest++, используя C++11 и CMake на Mac OS X?

Я пытаюсь скомпилировать тесты для библиотеки, которая использует C++ 11 с использованием CMake. Я успешно использовал UnitTest++ с C++ 11 в Ubuntu, однако Mac OS X дает мне ошибки компоновщика.

В CMake мои флаги компоновщика и библиотеки для APPLE выглядят так:

SET(CMAKE_CXX_FLAGS "--stdlib=libc++ --std=c++11")
TARGET_LINK_LIBRARIES(mytest unittest++)

Компиляция с этим дает мне ошибки компоновщика, такие как:

Undefined symbols for architecture x86_64:
  "std::string::c_str() const", referenced from:
      UnitTest::MemoryOutStream::GetText() const in libunittest++.a(MemoryOutStream.o)
  "std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::str() const", referenced from:
      UnitTest::MemoryOutStream::GetText() const in libunittest++.a(MemoryOutStream.o)
  "std::ostream::~std::ostream()", referenced from:
      construction vtable for std::ostream-in-UnitTest::MemoryOutStream in libunittest++.a(TestRunner.o)
      construction vtable for std::ostream-in-UnitTest::MemoryOutStream in libunittest++.a(Test.o)
....

Вот полная паста.

1 ответ

Решение

Похоже, ваша копия libunittest++.a был скомпилирован с другой реализацией стандартной библиотеки C++. На OS X теперь есть две реализации стандартной библиотеки C++: libstdC++ GNU, чьи заголовочные файлы находятся в /usr/include/c++/4.2.1 и libC++ от Clang, чьи заголовочные файлы находятся в /usr/lib/c++/v1/,

Ваша копия libunittest++.a похоже, что он был скомпилирован с GNU libstdC++, поэтому вы можете решить проблему, используя ту же библиотеку для вашей программы:

SET(CMAKE_CXX_FLAGS "-stdlib=libstdc++ -std=c++11")

Или пересобрать libunittest++.a с использованием Clang's libC++.

Также см. Этот вопрос для получения дополнительной полезной информации.

Другие вопросы по тегам