写一个简单的hello程序
<span style="color:#666666;">#include<iostream>
using namespace std;
int main()
{
cout<<"hello."<<endl;
return 0;
}</span>
$ gcc hello.cpp -o hello.out
提示一大堆错误:
/tmp/ccz8WW2c.o:在函数‘main’中:
hello.cpp:(.text+0xa):对‘std::cout’未定义的引用
hello.cpp:(.text+0xf):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用
hello.cpp:(.text+0x14):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用
hello.cpp:(.text+0x1c):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用
/tmp/ccz8WW2c.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
hello.cpp:(.text+0x4a):对‘std::ios_base::Init::Init()’未定义的引用
hello.cpp:(.text+0x59):对‘std::ios_base::Init::~Init()’未定义的引用
collect2: 错误:ld 返回 1
$ g++ hello.cpp -o hello.out
编译成功。
通过上述例子,查了下gcc和g++的使用和区别,当做新鸟的反思笔记。
GCC(GNU Compiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器,被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。原本只能处理 C语言,GCC 很快地扩展,变得可处理 C++,之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。
g++是 linux下c++的编译器,在执行编译工作的时候,总共需要4步
1.预处理,生成.i的文件
2.将预处理后的文件不转换成汇编语言,生成文件.s
3.有汇编变为目标代码(机器代码)生成.o的文件
4.连接目标代码,生成可执行程序。
简单的说,gcc 是c的编译器,g++是c++的编译器。
后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了。
编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
所以,编译C++文件,使用gcc只是进行编译,无法进行链接,导致include库失败。应使用g++来完成C++源码的编译,链接工作。