试图在mac上编译C ++代码

时间:2013-02-12 20:55:30

标签: c++ macos compilation

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

任何人都知道可能会发生什么?

2 个答案:

答案 0 :(得分:1)

  

我尝试使用gcc从终端编译

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

答案 1 :(得分: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