【问题标题】:C++: "Undefined symbols for architecture x86_64" error when "std" is usedC++:使用“std”时出现“架构 x86_64 的未定义符号”错误
【发布时间】:2015-09-11 06:53:08
【问题描述】:

我是一名新的 C++ 程序员,我正在尝试运行一个简单的、

我创建了一个文件“test.cpp”,我正在使用 gcc 在命令行上编译它。命令是“gcc test.cpp -o test”。然后我运行“./test”。 (是的,这听起来很基础。)文件如下:

#include <iostream>

int main ()
{
  printf("Hello World!");
  std::cout << "Hi again!"; //Problem line
}

当我包含包含 std 的行时,gcc 返回以下长错误:

Undefined symbols for architecture x86_64:
  "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::__1::ios_base::getloc() const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in test-e54cb2.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in test-e54cb2.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::__1::cout", referenced from:
      _main in test-e54cb2.o
  "std::__1::ctype<char>::id", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::__1::locale::~locale()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "std::terminate()", referenced from:
      ___clang_call_terminate in test-e54cb2.o
  "___cxa_begin_catch", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
      ___clang_call_terminate in test-e54cb2.o
  "___cxa_end_catch", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
  "___gxx_personality_v0", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test-e54cb2.o
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in test-e54cb2.o
      Dwarf Exception Unwind Info (__eh_frame) in test-e54cb2.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我包含“using namespace std;”行,也会发生这种性质的错误。似乎任何对“std”的引用都会导致这种情况。

我已经阅读了许多关于“架构的未定义符号...”形式的错误的帖子。大多数似乎是针对简单问题或大型项目中的冲突引起的问题,似乎都没有解决我的特殊情况。

谁能指出我正确的方向?

【问题讨论】:

  • 包含 #include #include
  • gcc 是一个 C 编译器。您想使用 C++ 编译器和链接器来编译(和链接)C++ 代码。
  • @EvanCarslake 不。仅仅一个头文件可能怎么会导致链接器错误? (无论如何,在任何非人为的非模板示例中......)

标签: c++ macos gcc std


【解决方案1】:

您正在编写一个 C++ 程序。编译器称为g++(不是gcc)。所以使用:

g++ test.cpp -o test

使用g++ 设置链接器以链接到正确的C++ 运行时库。如果您碰巧编写了一个不使用任何标准库函数的 C++ 程序,那么 gcc 可能会工作,但它仍然是错误的编译器。

【讨论】:

  • 这是 100% 正确的。很高兴它是如此简单,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多