如何在 macOS 上链接 libc++?

Posted

技术标签:

【中文标题】如何在 macOS 上链接 libc++?【英文标题】:How can I link libc++ on macOS? 【发布时间】:2021-06-10 18:45:03 【问题描述】:

我正在尝试在 macOS 11.2 (x86-64) 上学习 C++,但在编译和链接我的代码时遇到了问题。下面列出了我的简单程序。

#include <algorithm>
#include <vector>

template<class I>
void pancake_sort(I first, I last)

    for (; first != last; first++)
        std::reverse(std::min_element(first, last), last);
        std::reverse(first, last);
    


int main(int argc, char *argv[])

    auto a = std::vector<int64_t>(argc - 1);
    std::transform(&argv[1], &argv[1] + (argc - 1), a.begin(), atoll);
    pancake_sort(a.begin(), a.end());

    return 0;

我正在尝试使用 clang -std=c++11 &lt;filename&gt; 进行编译,但收到以下错误消息:

Undefined symbols for architecture x86_64:
  "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:
      std::__1::vector<long long, std::__1::allocator<long long> >::__vallocate(unsigned long) in pancake_sort-cdbf1e.o
  "std::logic_error::logic_error(char const*)", referenced from:
      std::length_error::length_error(char const*) in pancake_sort-cdbf1e.o
  "std::length_error::~length_error()", referenced from:
      std::__1::__throw_length_error(char const*) in pancake_sort-cdbf1e.o
  "std::terminate()", referenced from:
      ___clang_call_terminate in pancake_sort-cdbf1e.o
  "typeinfo for std::length_error", referenced from:
      std::__1::__throw_length_error(char const*) in pancake_sort-cdbf1e.o
  "vtable for std::length_error", referenced from:
      std::length_error::length_error(char const*) in pancake_sort-cdbf1e.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "operator delete(void*)", referenced from:
      std::__1::_DeallocateCaller::__do_call(void*) in pancake_sort-cdbf1e.o
  "operator new(unsigned long)", referenced from:
      std::__1::__libcpp_allocate(unsigned long, unsigned long) in pancake_sort-cdbf1e.o
  "___cxa_allocate_exception", referenced from:
      std::__1::__throw_length_error(char const*) in pancake_sort-cdbf1e.o
  "___cxa_begin_catch", referenced from:
      ___clang_call_terminate in pancake_sort-cdbf1e.o
  "___cxa_free_exception", referenced from:
      std::__1::__throw_length_error(char const*) in pancake_sort-cdbf1e.o
  "___cxa_throw", referenced from:
      std::__1::__throw_length_error(char const*) in pancake_sort-cdbf1e.o
  "___gxx_personality_v0", referenced from:
      _main in pancake_sort-cdbf1e.o
      std::__1::vector<long long, std::__1::allocator<long long> >::vector(unsigned long) in pancake_sort-cdbf1e.o
      std::__1::__vector_base<long long, std::__1::allocator<long long> >::__vector_base() in pancake_sort-cdbf1e.o
      std::__1::vector<long long, std::__1::allocator<long long> >::__construct_at_end(unsigned long) in pancake_sort-cdbf1e.o
      std::__1::vector<long long, std::__1::allocator<long long> >::max_size() const in pancake_sort-cdbf1e.o
      std::__1::__throw_length_error(char const*) in pancake_sort-cdbf1e.o
      std::__1::__vector_base<long long, std::__1::allocator<long long> >::__destruct_at_end(long long*) in pancake_sort-cdbf1e.o
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我尝试添加标志-stdlib=libstdc++,但似乎libstdc++ 不再包含在macOS 中。还有什么我应该做的吗?

【问题讨论】:

编译时需要使用clang++而不是clang 虽然从 CLI 编译没有任何问题,但我强烈建议使用 Xcode 在 macOS 上使用 C++ 进行开发。在调试和分析等众多优势中,IDE 不会出现基本错误,例如调用 clang 而不是 clang++ @prapin 我不同意,而且很多人似乎同意我的观点:Xcode 在 C++ 社区中并不是很受欢迎,大多数人在 macOS 上使用其他 C++ IDE/编辑器。它工作得很好。你甚至不需要安装 Xcode,你只需要命令行工具。 @KonradRudolph 我并不是说其他​​ C++ IDE 不好。但我可以保证,根据我在 Xcode 上 8 年的 C++ 开发经验,Xcode 也是一个很好的 C++ 开发工具,尽管它只突出了 Swift。无论如何,我很确定使用 IDE(无论你喜欢哪个)比没有 IDE 更有效率。 在这里操作。我正在使用 VSCode 进行设置,这看起来很不错。再次感谢@KonradRudolph 指出我的错误。当我意识到那是什么时,我捂住了脸。 【参考方案1】:

根据 Konrad Rudolph,解决方案是使用 clang++ 而不是 clang 来编译 C++ 代码。

【讨论】:

以上是关于如何在 macOS 上链接 libc++?的主要内容,如果未能解决你的问题,请参考以下文章

C++ Singleton 无法在 Mac OS 上链接

如何在 Windows 上链接和编译 Raylib?

如何在 Matlab 极轴上链接数据图像?

如何在覆盆子上链接 OpenCV 的正确目录?

如何在Azure上链接docker容器?

如何使用cmake在mac上链接OpenGL相关库?