2

不知道我在这里遇到什么问题。

  • Mac 铿锵声 3.1 cmake
  • 测试
  • 几个文件
  • 使用少量 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。不知道这里还有什么可以推动这些问题。

4

2 回答 2

1

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

如果您能够使用 CMake 3.2 或更高版本,那么与其直接修改 C++ 编译器标志,我建议您只告诉 CMake 您要使用 C++11,然后让它计算出适当的编译器和链接器标志你。这可以通过在调用之前添加以下内容来完成project()

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

本文详细讨论了此功能和相关的 CMake功能

于 2016-01-24T02:30:53.880 回答
0

C++11 中没有关于名称修饰的任何内容,它从第一个 C++ 实现开始就一直在进行。但是,不要忘记您必须为相同的 stdlib 开关构建 gtest,因为它找不到标准库。

于 2012-06-30T09:43:02.040 回答