如何在Mac OS X上使用C ++ 11和CMake解决UnitTest ++链接器错误?

时间:2013-10-05 23:19:58

标签: macos c++11 linker cmake unittest++

我正在尝试编译使用CMake使用C ++ 11的库的测试。我在Ubuntu上使用UnitTest ++和C ++ 11取得了成功,但是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)
....

这是full paste

1 个答案:

答案 0 :(得分:0)

看起来您的libunittest++.a副本是使用标准C ++库的不同实现编译的。在OS X上,现在有两个标准C ++库的实现:GNU的libstdc ++,其头文件位于/usr/include/c++/4.2.1和Clang的libc ++,其头文件位于/usr/lib/c++/v1/

您的libunittest++.a副本似乎是使用GNU的libstdc ++编译的,因此您可以通过为您的程序使用相同的库来解决问题:

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

或者使用Clang的libc ++重新编译libunittest++.a

另请参阅this question以获取更多有用信息。