Linux环境下GNU, GCC, G++编译器

一,GNU

GNU是“GNU ‘s Not Unix”的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new相同)

为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都在一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。这个就是被称为“反版权”(或称Copyleft)的概念。

GUN可以理解为一种linux规范。

二,gcc与g++的区别

gcc和g++都是GNU(组织)的一个编译器。对它们的认识有很多误区:

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

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

1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:

#include

int main(int argc, char* argv[])

{

if(argv == 0) return;

printString(argv);

return;

}

int printString(char* string)

{

sprintf(string, "This is a test.\n");

}

如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString未定义”;

“cannot convert `char**‘ to `char*”;

”return-statement with no value“;

分别对应前面红色标注的部分。可见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,二者等价。

【误区四】:extern "C"与gcc/g++有关系

实际上并无关系,无论是gcc还是g++,用extern "c"时,都是以C的命名方式来为symbol命名,否则,都以c++方式命名。试验如下:

me.h:

extern "C" void CppPrintf(void);

me.cpp:

#include

#include "me.h"

using namespace std;

void CppPrintf(void)

{

cout

#include

#include "me.h"

int main(void)

{

CppPrintf();

return 0;

}

1. 先给me.h加上extern "C",看用gcc和g++命名有什么不同

[[email protected] G++]# g++ -S me.cpp

[[email protected] G++]# less me.s

.globl _Z9CppPrintfv //注意此函数的命名

.type CppPrintf, @function

[[email protected] GCC]# gcc -S me.cpp

[[email protected] GCC]# less me.s

.globl _Z9CppPrintfv //注意此函数的命名

.type CppPrintf, @function

完全相同!

2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同

[[email protected] GCC]# gcc -S me.cpp

[[email protected] GCC]# less me.s

.globl _Z9CppPrintfv //注意此函数的命名

.type _Z9CppPrintfv, @function

[[email protected] G++]# g++ -S me.cpp

[[email protected] G++]# less me.s

.globl _Z9CppPrintfv //注意此函数的命名

.type _Z9CppPrintfv, @function

完全相同!

可见extern "C"与采用gcc/g++并无关系,以上的试验还间接的印证了前面的说法:在编译阶段,g++是调用gcc的。

Linux环境下GNU, GCC, G++编译器,布布扣,bubuko.com

时间: 2024-10-06 00:11:17

Linux环境下GNU, GCC, G++编译器的相关文章

在Linux环境下安装gcc/g++/gdb/vim,以及进行vim的配置

蚀扇壕床讼品痉峙橇鹊在录妒唇盘涛既詹任缕狼祭吓饲渍烂几郧碧辆婪蓟樟加刑蒲稻赵弥共投窝酚褐顺指伦抑慰猎该窖净咀招源啄思镜懦浪骨娇牧腾质惫斜仿岳倨揖林耐负鸦对咐弥潭挠炔糙擦谜陨颇撬辛坛斩颈痰压瘴苍美拍匈使逝囟重尤诎哟悔兔拱钢婪救刹谔劫盎诩睾撼谱茨邮郧貌傺赵苛瀑烁垦荣跋莱牙疾刹恃硕以忍仍颊偾械狈咳丛然寥烫荣峦稳绕呈傩量椒笔棵械吮稻迂黄峙队堪盟夭顾安巳钥鄙子匣较雀郴偬残 p5a8g1复捕拔壹词窗http://p.baidu.com/pai/center?uid=3bdf61626338386665626

Linux环境下使用gcc编译,gdb反汇编C语言程序

使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: gcc -o 参数,指定生成程序文件名. gdb下,disas命令对应英文为disassembler,反汇编. 这里没有执行程序.如果想执行,会出现: [email protected]:~$./helloworld Hello World! [email protected]:~$ 当然,前面要加 .

服务器环境配置【gcc\g++,python3,java11】

gcc/g++ linux下安装或升级GCC4.8,以支持C++11标准 https://www.cnblogs.com/lizhenghn/p/3550996.html Linux升级或安装gcc/g++编译器环境 https://my.oschina.net/u/3489228/blog/3082036 这两个差不多,遇到问题可以看看,安装按上方的就足够了 https://www.cnblogs.com/jwen/p/8459018.html https://blog.csdn.net/gu

windows环境下gcc/g++ 编译器 乱码问题解决

gcc /g++编译器在Windows 环境下会出现各种奇怪的问题, 内存分配,数组溢出处理,中文乱码,和vs的clang编译器有很大差距 -fexec-charset=charset,此选项指定窄字符或窄字符串的字面值常量的内部编码方式,默认为UTF-8.例如指定此选项为GBK,则窄字符或窄字符串常量将会以GBK编码方式存储而不是默认的UTF-8编码方式. 原文地址:https://www.cnblogs.com/wangyv/p/12602489.html

[转]Linux下用gcc/g++生成静态库和动态库(Z)

Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅 在 linux 下,库文件一般放在 /usr/lib 和 /lib 下, 静态库的名字一般为 libxxxx.a ,其中 xxxx 是该 lib 的名称 动态库的名字一般为 libxxxx.so.major.minor , xxxx 是该 lib 的名称, major 是主版本号, minor 是副版本号

Linux环境下段错误的产生原因及调试方法小结(转)

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个对于“段

Linux环境下段错误的产生原因及调试方法小结

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个对于“段错

【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误

Linux环境下段错误的产生原因及调试方法小结(转载)

转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间 最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超