链接 C++ 程序时出错

Posted

技术标签:

【中文标题】链接 C++ 程序时出错【英文标题】:Error when linking C++ program 【发布时间】:2013-02-23 00:36:59 【问题描述】:

我正在尝试编译一些非常简单的 C++ 代码,但每次尝试都会收到此错误:

Undefined symbols for architecture x86_64:
"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 ccdb9vrE.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()", referenced from:
  _main in ccdb9vrE.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
  _main in ccdb9vrE.o
"std::ios_base::Init::Init()", referenced from:
  __static_initialization_and_destruction_0(int, int)in ccdb9vrE.o
"std::ios_base::Init::~Init()", referenced from:
  ___tcf_0 in ccdb9vrE.o
"std::cin", referenced from:
  _main in ccdb9vrE.o
"std::cout", referenced from:
  _main in ccdb9vrE.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 ccdb9vrE.o
"std::terminate()", referenced from:
  _main in ccdb9vrE.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 ccdb9vrE.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
  _main in ccdb9vrE.o
"std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)", referenced from:
  _main in ccdb9vrE.o
"___gxx_personality_v0", referenced from:
  Dwarf Exception Unwind Info (__eh_frame) in ccdb9vrE.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

我正在使用这个命令来编译它:

$ gcc script.cc

这是脚本的代码:

#include <iostream>
#include <string>
using namespace std;

int main() 
        cout << "Please enter your name:\n";
    string name;
    cin >> name;
    cout << "Hello, " << name << endl;

    return 0;

我确实下载了最新的开发工具。如果有人可以提供帮助,那就太好了。

【问题讨论】:

使用g++,而不是gcc 艾迪生:为自己的错误指责别人是不明智的。通常,人们不会简单地假设一个编译器错误。我相应地编辑了标题。 Compilation error "Undefined symbols" on osx 的可能重复项 【参考方案1】:

使用 g++,因为它是 c++ 文件而不是 c 文件... 它应该这样工作......

【讨论】:

【参考方案2】:

gcc 是 GNU C 编译器可执行文件的名称;因此,它旨在编译和构建 C 代码。 要将您的代码编译为 C++,请使用 g++ 可执行文件。

gcc 实际上会编译 C++ 代码(基于文件扩展名),但不会正确链接生成的二进制文件(由于省略了 libstdc++)。

【讨论】:

【参考方案3】:

无论如何:到目前为止,没有一个答案提到链接在 GCC 中不起作用但在 G++ 中起作用的实际原因。问题不在于编译步骤,而在于链接。 gcc 默认不链接 C++ 标准库,g++ 会。

【讨论】:

以上是关于链接 C++ 程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

编译c++程序的内存分配代码时出错

在 Java 和 C++ 应用程序中使用 protobuf 解析时出错

visual C++ 6.0 问题:链接:致命错误LNK1104:无法打开文件“调试/ d.exe“ 执行link.exe时出错。

使用 CreateProcess 从 Win32 C++ 应用程序启动 Java 应用程序时出错

在 C++ 中转换类型时出错

出错时停止代码执行 (C++)