4

可能重复:
GCC 链接器找不到标准库?

我正试图弄乱我在假期买的这本 C++ 书,我对 python 的理解有限,所以这些东西对我来说真的很奇怪。

我将第一节课中的这段代码输入到我的文本编辑器中,并将其保存为 .cpp 文件。

#include <iostream>
int main()
{
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "The sum of " << v1 << " and " << v2
              << " is " << v1 + v2 << std::endl;
    return 0;
}

但是当我尝试编译它时,我的终端给出了这个疯狂的输出,这是怎么回事?

Raymond-Weisss-MacBook-Pro:c++ Raylug$ gcc prog2.cpp
Undefined symbols for architecture x86_64:
  "std::basic_istream<char, std::char_traits<char> >::operator>>(int&)", referenced from:
      _main in cckdLEun.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
      _main in cckdLEun.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from:
      _main in cckdLEun.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in cckdLEun.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in cckdLEun.o
  "std::cin", referenced from:
      _main in cckdLEun.o
  "std::cout", referenced from:
      _main in cckdLEun.o
  "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in cckdLEun.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 cckdLEun.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Raymond-Weisss-MacBook-Pro:c++ Raylug$ 
4

2 回答 2

5

是的,您应该使用g++来编译 C++ 而不是gcc,但可能值得详细说明答案,因为您说您是使用编译器的新手。

GCC 代表 GNU Compiler Collection,是可用于编译各种语言的源代码的程序集合。该命令gcc为用户编译程序提供了外部接口。该gcc命令将尝试从源文件的文件扩展名中确定要编译的语言。例如,一个名为的文件hello.c将编译为 C,一个名为的文件foo.cpp将编译为 C++,一个名为的文件bar.m将编译为 Objective-C。

无论文件扩展名如何,您都可以-x选择显式指定要编译的语言。例如,gcc -x c++ main.c将编译main.c为 C++ 文件,尽管具有.c扩展名。

但是,即使gcc会确定您的文件是 C++,默认情况下它仍然不会链接到 C++ 标准库。必须链接到该库才能编译除最简单的 C++ 文件之外的任何内容。-lstdc++您可以通过添加选项来链接到标准库的 GCC 实现。所以gcc -lstdc++ prog2.cpp应该可以正常工作。

但是,为方便起见,为 C++ 程序员提供了另一个命令。即,g++。该g++命令将自动链接到 C++ 标准库,因此您不必显式执行此操作。它还导致.c,.h.i文件被视为 C++ 文件。

如果你一直坚持gcc编译 C 和g++,你应该没有问题。

于 2012-12-27T20:14:57.333 回答
1

You need to use g++ instead of gcc

于 2012-12-27T19:48:15.263 回答