您的位置:首页 > 运维架构 > Linux

Linux初学对g++,gcc

2015-06-12 15:17 330 查看
在用vim写完一个简单的hello.cpp的小程序:

#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
cout<<"hello,ubunt"<<endl;
return 0;}


用gcc hello.cpp -o helloni时候,总报错:

hello.cpp:(.text+0x14):对‘std::cout’未定义的引用

hello.cpp:(.text+0x19):对‘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+0x21):对‘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+0x29):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用

/tmp/ccIypXVs.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:

hello.cpp:(.text+0x51):对‘std::ios_base::Init::Init()’未定义的引用

hello.cpp:(.text+0x68):对‘std::ios_base::Init::~Init()’未定义的引用

返回终端,猛然发现,之前编译的命令不是这样的,这个世界上,不止有个gcc还有个g++。然后g++ hello.cpp -o hellon果然,编译马上成功。

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++来完成链接,为了统一起见,Linux编译/链接统统用g++。

gcc and g++分别是GNU的c & c++编译器   

gcc/g++在执行编译工作的时候,总共需要4步   

1.预处理,生成.i的文件[预处理器cpp]   

2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]   

3.由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]   

4.连接目标代码,生成可执行程序[链接器ld]

gcc和g++的区别

gcc和g++都是GNU(组织)的一个编译器。

误区一:gcc只能编译c代码,g++只能编译c++代码

两者都可以,但是请注意:

1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。

2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++

严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

gcc和g++的区别

我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: