C++ Primer(第5版)初学者的困惑

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

<分区>

Possible Duplicate:
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$ 

最佳答案

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

GCC 代表 GNU 编译器集合,是可用于编译各种语言的源代码的程序集合。命令gcc为用户提供编译程序的外部接口(interface)。 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++ ,你应该没有问题。

关于C++ Primer(第5版)初学者的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14060336/

相关文章:

c++ - 向字符串添加字符

c++ - 返回标准容器会导致容器内容的拷贝吗?

Python - 标准库 - ascii( ) 函数

c++ - 我的 SFINAE 检查 std::map/std::vector 有什么问题?

c++ - 使用默认构造函数初始化 std::vector

c++ - 在链表中添加两个数字

c++ - 为什么 C++ 拒绝将结构附加到包含字符串类成员的二进制文件?

c++ - 输出到字符串的 cout 等价物是什么?

c++ - 为什么将 operator void*() 转换函数添加到 C++ 流类中?

c++ - 我如何为 cc_library 添加默认的 copts,如 '-fopenmp'?