我刚开始学习c ++并编写了这个非常简单的程序来使用向量。但它没有编译。我想看看订阅一个不存在的元素的行为。
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
vector<int> list;
cout << list[0];
return 0;
}
当我使用cc main.cpp
在我的Mac上编译它时,我得到了一个难以理解的错误。
Undefined symbols for architecture x86_64:
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(int)", referenced from:
_main in main-651b3f.o
"std::__1::cout", referenced from:
_main in main-651b3f.o
"std::terminate()", referenced from:
___clang_call_terminate in main-651b3f.o
"operator delete(void*)", referenced from:
std::__1::__vector_base<int, std::__1::allocator<int> >::~__vector_base() in main-651b3f.o
"___cxa_begin_catch", referenced from:
___clang_call_terminate in main-651b3f.o
"___gxx_personality_v0", referenced from:
_main in main-651b3f.o
Dwarf Exception Unwind Info (__eh_frame) in main-651b3f.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
cLion
IDE不会抱怨同一程序的编译问题。有什么想法发生了什么?
答案 0 :(得分:7)
cc
是构建C程序的命令。改为写c++
。
这些通常是gcc
和g++
(分别),或clang
和clang++
(分别)等可执行文件的别名。
即使这些可执行文件最终调用相同的前端(通常也是如此),但重要的是调用哪个命令。例如,cc
别名不会导致C ++标准库被链接,这正是您所看到的问题。
顺便说一句,由于您尝试输出不存在的元素,因此您的程序具有未定义的行为。因此,技术上,您甚至可以在修复构建命令后获得此结果;)
答案 1 :(得分:3)
您正在尝试使用C编译器编译C ++代码。您应该使用适当的C ++编译器(例如c++
)。
另一件事是你的程序中有一个未定义的行为:
vector<int> list;
cout << list[0];
向量始终初始化为空。所以你试图访问一个尚不存在的元素。这很可能会导致段错误。尝试插入一些东西:
vector<int> list;
list.push_back(1);
cout << list[0];