【问题标题】:clang mac link errors with gtest Undefined symbols for architecture x86_64clang mac 链接错误与 gtest 架构 x86_64 的未定义符号
【发布时间】:2012-06-30 09:23:46
【问题描述】:

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

  • 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。不知道还有什么其他原因会导致这些问题。

【问题讨论】:

    标签: c++ macos cmake clang


    【解决方案1】:

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

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

    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    

    this article 中详细讨论了此和相关 CMake 功能。

    【讨论】:

    • 还有another article on that blog 明确处理将 gtest 添加到您可能会发现有用的 CMake 构建。那里讨论的方法对跨不同平台的编译器/链接器标志问题更加健壮。它直接将 gtest 构建为您的主要构建的一部分,而不需要预先构建一个。
    【解决方案2】:

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

    【讨论】:

    • 对不起-意思是c++ 11 inline namespace
    • 我也只是用相同的 stdlib 标志重建了 gtest(我在我的 cmake 中看到的 gtest 已经是那样了)并且得到了相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多