【问题标题】:C++ Primer (5th edition) beginner's quandary [duplicate]C++ Primer(第5版)初学者的困惑[重复]
【发布时间】:2012-12-13 04:15:21
【问题描述】:

可能重复:
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$ 

【问题讨论】:

  • gcc 适用于 C。g++ 适用于 C++。
  • 是的,这行得通!非常感谢,编译器对我来说仍然是新的和神秘的。
  • 不确定this one 是否会被视为骗子。不过,我知道人们以前也遇到过这个问题。
  • C++ Primer 是一本好书。给你这本书的人一定做过他们的研究!

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


【解决方案1】:

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

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++,你应该没有问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 2013-12-31
      • 2015-07-30
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多