【问题标题】:How to solve UnitTest++ linker errors using C++11 and CMake on Mac OS X?如何在 Mac OS X 上使用 C++11 和 CMake 解决 UnitTest++ 链接器错误?
【发布时间】:2013-10-12 18:44:06
【问题描述】:

我正在尝试为使用 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

【问题讨论】:

  • 不应该是SET(CMAKE_CXX_FLAGS "-stdlib=libc++ -std=c++11")吗?
  • 这没什么区别。

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


【解决方案1】:

看起来您的 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

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2011-11-06
    • 2014-01-05
    相关资源
    最近更新 更多