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

Trying to compile C++ code on mac

本文关键字:编译 C++ 代码 mac      更新时间:2023-10-16

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

有人知道可能发生了什么吗?

ld:找不到体系结构x86_64 的符号

这意味着链接器"ld"无法找到程序使用的某些符号的定义。所以您知道编译已经成功了。

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

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

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


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

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

我尝试使用gcc 从终端进行编译

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