为什么这个简单的 c++ 代码无法编译

WHY does this simple c++ code not compile?

本文关键字:代码 编译 c++ 简单 为什么      更新时间:2023-10-16
#include <iostream>
#include <cstdlib>
#include <ctime>    
using namespace std;

int main()
{
    srand(time(NULL));
    cout << rand() << endl ; 
    return 0; 
}

错误信息:

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::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test-c5b4b5.o
  "std::__1::ios_base::getloc() const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test-c5b4b5.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test-c5b4b5.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test-c5b4b5.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(int)", referenced from:
      _main in test-c5b4b5.o
  "std::__1::cout", referenced from:
      _main in test-c5b4b5.o
  "std::__1::ctype<char>::id", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test-c5b4b5.o
  "std::__1::locale::~locale()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test-c5b4b5.o
  "std::terminate()", referenced from:
      ___clang_call_terminate in test-c5b4b5.o
  "___cxa_begin_catch", referenced from:
      ___clang_call_terminate in test-c5b4b5.o
  "___gxx_personality_v0", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test-c5b4b5.o
      Dwarf Exception Unwind Info (__eh_frame) in test-c5b4b5.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

BLUF:使用g++,而不是gcc

这是链接器错误的示例。你的程序编译得很好——例如,你可以在错误消息中看到对中间*.o文件的引用——但它遇到了一个问题,将东西链接在一起制作可执行文件——链接器找不到程序所需的许多功能(例如,iostream库中使用的一些东西(。

原因是因为你用来构建程序的命令以一种使链接器尝试将其构建为 C 程序的方式执行此操作 - 特别是,它只链接到 C 标准库,而不是C++标准库,这就是为什么它找不到这些东西。

通过将生成命令

更改为使链接器知道它正在生成C++程序的命令,错误将消失。

我自己使用 gnu 编译器集合遇到了这个问题——虽然gcc足够聪明,可以将*.cpp程序编译为C++代码,但它仍然试图将结果链接为 C 程序。因此,您需要使用 g++ 命令来构建C++程序。