unix编译器gcc和g++

来源:互联网 发布:淘宝衣服尺码怎么看 编辑:程序博客网 时间:2024/05/21 14:07

写一个简单的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++源码的编译,链接工作。



0 0
原创粉丝点击