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

ler*_*ray 4 c++ standard-library c++-standard-library

可能重复:
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;
}
Run Code Online (Sandbox Code Playgroud)

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

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$ 
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 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++,你应该没有问题.