版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/u012823258/article/details/36890125

一。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++命名有什么不同
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type CppPrintf, @function
全然同样!

2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv //注意此函数的命名
.type _Z9CppPrintfv, @function
全然同样!
可见extern "C"与採用gcc/g++并无关系,以上的试验还间接的印证了前面的说法:在编译阶段。g++是调用gcc的。

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

  1. Linux环境下GNU, GCC, G++编译器(转)

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

  2. Linux环境下的GCC编译器与GDB调试工具介绍

    假如现在我们有如下代码需要编译运行和调试.文件名为:test.c #include <stdio.h> int main() { int day, month, year, sum, le ...

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

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  4. windows和linux环境下java调用C++代码-JNI技术

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...

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

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

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

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...

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

    转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

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

    本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...

  9. Linux 环境下一些常用命令(四)

    转自 http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users 31. 命令: rm 'rm ...

随机推荐

  1. LINQ-let子句、join子句

    1.Let子句 let子句用于在LINQ表达式中存储子表达式的计算结果,既let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以在后续的LINQ中 ...

  2. java一些对象概念扫盲帖(DO VO DTO PO)

    资料来源:http://virusswb.blog.51cto.com/115214/458636 BO:Business Object,业务对象.主要是承载业务数据的实体.处理业务逻辑的时候使用,数 ...

  3. 三分钟理解Java中字符串(String)的存储和赋值原理

    可能很多Java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟时间便可理解. 1.在看例子之前,确保你理解以下几个术语: 栈:由JVM分配区域,用于保存线程执行 ...

  4. 撩课-Web大前端每天5道面试题-Day11

    1. 如何手写一个JQ插件? 方式一: $.extend(src) 该方法就是将src合并到JQ的全局对象中去: $.extend({ log: ()=>{alert('撩课itLike');} ...

  5. CSS实现文字两端对齐

    最近的项目遇到了这样的需求:(要求标题部分不管文字多少,都必须两端对齐) 如下图: 当时也没有多想直接使用‘ ’进行代替,毕竟产品同学想快一点看到效果,不敢怠慢!不过到第二个页面就傻眼了. 如图: 这 ...

  6. css 样式加载次序

    一般而言,所有的样式会根据下面的规则层叠于一个新的虚拟样式表中,其中数字 4 拥有最高的优先权(本人理解为:先加载1的样式,然后用2的样式覆盖1中的样式,3.4同理) 浏览器缺省设置(浏览器默认的样式 ...

  7. CF891E Lust

    传送门 题目大意 你有 \(n\) 个数 \(a_1,a_2...a_n\) 要进行 \(k\) 次操作 每次随机选择一个数 \(x\),使得答案加上 \(\prod_{i \neq x}a_i\) ...

  8. BZOJ2476: 战场的数目(矩阵快速幂)

    题意 题目链接 Sol 神仙题Orzzz 考虑两边是否有\(1\) 设\(f[i]\)表示周长为\(2i\)的方案数 第一种情况:左侧或右侧有一个1,那么把这个1删去,对应的方案数为\(f[i - 1 ...

  9. SignalR实时通信

    /// <summary> /// Message集线器类 /// </summary> [HubName("chathub")] public class ...

  10. 【转载记录】Accessing Device Drivers from C#

    来源:http://www.drdobbs.com/cpp/accessing-device-drivers-from-c/184416423/   Device Drivers are writte ...