与gtest clang mac链接错误架构x86_64的未定义符号

时间:2012-06-30 09:23:47

标签: c++ macos cmake clang

不确定我在这里遇到什么问题。

  • Mac clang 3.1 cmake
  • GTEST
  • 少量文件
  • 使用少量C ++ 11功能
  • 我已下载并安装了XCode构建工具

CMAKE_CXX_FLAGS = -Wall -std=c++0x -stdlib=libc++ -v

使用输出构建良好...

[100%] Building CXX object CMakeFiles/soupbintcptest.dir/soupmessages_tests.cpp.o
clang version 3.1 (tags/RELEASE_31/final)
Target: x86_64-apple-darwin11.3.0
Thread model: posix

链接转储了一系列错误。 ABI错误?我知道这个C ++ 11名称空间错误发生了。

Undefined symbols for architecture x86_64:

它们是std::命名空间中不会链接的所有内容:

 "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::_Setprecision)", referenced from:
      testing::AssertionResult testing::internal::FloatingPointLE<float>(char const*, char const*, float, float) in libgtest.a(gtest-all.cc.o)
      testing::AssertionResult testing::internal::FloatingPointLE<double>(char const*, char const*, double, double) in libgtest.a(gtest-all.cc.o)
      testing::Message::Message() in libgtest.a(gtest-all.cc.o)

"std::cerr", referenced from:
      testing::internal::GTestLog::GetStream() in libgtest.a(gtest-all.cc.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      testing::UnitTest::AddTestPartResult(testing::TestPartResult::Type, char const*, int, testing::internal::String const&, testing::internal::String const&) in libgtest.a(gtest-all.cc.o)
      testing::internal::SingleFailureChecker::~SingleFailureChecker() in libgtest.a(gtest-all.cc.o)
      testing::internal::StringStreamToString(std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >*) in libgtest.a(gtest-all.cc.o)
      testing::TestInfo::TestInfo(char const*, char const*, char const*, char const*, void const*, testing::internal::TestFactoryBase*) in libgtest.a(gtest-all.cc.o)
      testing::TestInfo::~TestInfo() in libgtest.a(gtest-all.cc.o)
      testing::internal::ReportInvalidTestCaseType(char const*, char const*, int) in libgtest.a(gtest-all.cc.o)
      testing::internal::XmlUnitTestResultPrinter::PrintXmlUnitTest(__sFILE*, testing::UnitTest const&) in libgtest.a(gtest-all.cc.o)
      ...

我相信我用相同的clang ++版本构建了gtest。不知道还有什么可以解决这些问题。

2 个答案:

答案 0 :(得分:1)

当链接器将不同的c ++库提供给与编译器正在构建的库相匹配的库时,我发现了类似的错误。在您的情况下,您只是修改编译器标志,但链接器不知道您的选择,并且可能链接到错误的C ++库。

如果你能够使用CMake 3.2或更高版本,那么我建议你不要直接修改C ++编译器标志,而是告诉CMake你想要使用C ++ 11然后让它运行适当的您的编译器和链接器标志。这可以通过在<{em> project()电话之前添加以下来完成:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

这个及相关的CMake功能在this article中详细讨论。

答案 1 :(得分:0)

关于名称修改没有C ++ 11,它从最初的C ++实现开始就一直在进行。但是,不要忘记你必须为同一个stdlib开关构建gtest,因为它找不到标准库。