-2

我正在尝试在我的 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

有谁知道可能会发生什么?

4

2 回答 2

1

我尝试使用 gcc 从终端编译

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

于 2013-02-12T20:58:18.920 回答
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
于 2013-02-12T21:20:59.967 回答