C ++ Primer(第5版)初学者的窘境

时间:2012-12-27 19:44:07

标签: c++ standard-library c++-standard-library

  

可能重复:
  GCC linker can’t find standard library?

我正在试图弄乱我在假期中获得的这本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$ 

2 个答案:

答案 0 :(得分:5)

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

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

您可以使用-x选项显式指定要编译的语言,而不管文件扩展名是什么。例如,gcc -x c++ main.cmain.c编译为C ++文件,尽管具有.c扩展名。

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

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

如果您始终坚持使用gcc来编译C和g++,那么您应该没有问题。

答案 1 :(得分:1)

您需要使用g ++而不是gcc