【问题标题】:Trying to compile C++ code on mac试图在mac上编译C++代码
【发布时间】:2013-02-12 20:55:30
【问题描述】:

我正在尝试在我的 Mac 上编译一些 C++ 代码。我可以使用 Xcode 运行它,但是当我尝试使用 gcc 从终端编译时,出现以下错误:

Undefined symbols for architecture x86_64:
  "std::cout", referenced from:
      _main in ccOJDOlb.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _main in ccOJDOlb.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccOJDOlb.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in ccOJDOlb.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

有人知道会发生什么吗?

【问题讨论】:

标签: c++ macos compilation


【解决方案1】:

ld:未找到架构 x86_64 的符号

这表示链接器“ld”无法找到程序使用的某些符号的定义。这样就知道编译成功了。

并且 ld 列出了具体的符号。请注意,它们都来自标准库。这应该告诉您链接器可能找不到标准库。

通常,当您使用库时,您必须使用链接标志告诉编译器工具链。但是对于一种语言的标准库,GNU 编译器集合中的编译器通常只是假设您需要该语言的库。所以运行 gcc 命令会自动包含 C 标准库,运行 g++ 会自动包含 C++ 标准库等。但是请注意,运行 'gcc' 不会自动链接到 C++ 标准库。您很可能正在运行命令“gcc”,而只是没有为 C++ 标准库添加正确的链接器标志。

如果出于某种原因您想使用 gcc 而不是 g++,您必须使用 -lstdc++ 之类的标志明确声明您需要标准库。


另外,除非你真的想要 gcc 并且你自己在 OS X 上安装它的最新版本,否则你可能想要切换到 clang/clang++ 和 C++ 标准库的 libc++ 实现。 Xcode 自带的 gcc 是基于老版本的,标准库也同样老。 Xcode 已经过渡到 clang 作为系统编译器已经有一段时间了。 clang 编译器驱动程序与 gcc 具有基本兼容性,因此您可以使用许多相同的基本标志。这是一个很好的开始:

clang++ -std=c++11 -stdlib=libc++ -Wall -Wextra

【讨论】:

    【解决方案2】:

    我尝试使用 gcc 从终端编译

    然后尝试g++ 而不是普通的gcc。前者自动链接到 C++ 标准库,后者不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2013-09-25
      相关资源
      最近更新 更多