如何在OSX中使用(链接)libc ++的调试版本?

时间:2018-03-27 08:37:13

标签: c++ macos clang llvm libc++

我想在Mac OS X中启用libc ++的调试版本,所以我在cxx_build_flags [Debug Version of libC++]中定义_LIBCPP_DEBUG = 1, 但无法链接libc ++的调试功能。我想我的系统中只有libc ++的发布版本,所以如何在Mac OS X中获得libc ++的调试版本

Undefined symbols for architecture x86_64:

"std::__1::__libcpp_db::__decrementable(void const*) const", referenced from: void std::__1::__nth_element<std::__1::__debug_less<std::__1::__less<float, float> >&, std::__1::__wrap_iter<float*> >(std::__1::__wrap_iter<float*>, std::__1::__wrap_iter<float*>, std::__1::__wrap_iter<float*>, std::__1::__debug_less<std::__1::__less<float, float> >&)

2 个答案:

答案 0 :(得分:1)

我尝试重新激活此线程,而没有更多详细信息的答案。

我有同样的问题。这很容易复制:

#include <string>

int main()
{
  std::string name;
  return 0;
}

然后使用:

clang++ -D_LIBCPP_DEBUG=1 main.cpp

我们获得:

Undefined symbols for architecture x86_64:
  "std::__1::__libcpp_db::__insert_c(void*)", referenced from:
      void std::__1::__libcpp_db::__insert_c<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) in main-7ff3c5.o
  "std::__1::__libcpp_db::__erase_c(void*)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string() in main-7ff3c5.o
  "std::__1::__c_node::~__c_node()", referenced from:
      std::__1::_C_node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~_C_node() in main-7ff3c5.o
  "std::__1::__get_db()", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string() in main-7ff3c5.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string() in main-7ff3c5.o
  "typeinfo for std::__1::__c_node", referenced from:
      typeinfo for std::__1::_C_node<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > in main-7ff3c5.o
  "vtable for std::__1::__c_node", referenced from:
      std::__1::__c_node::__c_node(void*, std::__1::__c_node*) in main-7ff3c5.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我使用brew的g++-9 Providen(一个真正的g ++而不是伪装的Apple Clang编译器),它将编译并完美运行。

忘记使用libc ++的调试模式,这是唯一的解决方案吗?

注意:我在https://forums.developer.apple.com/thread/99194中看到了相同的问题 仍然没有答案。

答案 1 :(得分:0)

我想我可以使用它!

所以我采取的步骤,

  1. 检查您的工具链__config文件中_LIBCPP_VERSION的价值。
  2. 浏览设置该版本的提交的源仓库
  3. 从该提交中找到debug.cpp文件
  4. debug.cpp包含/编译/链接到您的项目(并记住设置_LIBCPP_DEBUG=1)。

对我来说,这些步骤的中间结果是(使用Catalina,XCode版本11.3.1)