Linux中g++与gcc的区别
转自:https://blog.csdn.net/bit_clearoff/article/details/53965514
Windows中我们常用vs来编译编写好的C和C++代码;vs把编辑器,编译器和调试器等工具都集成在这一款工具中,在Linux下我们能用什么工具来编译所编写好的代码呢,其实Linux下这样的工具有很多,但我们只介绍两款常用的工具,它们分别是gcc和g++.
工具用法介绍
gcc和g++的用法都是一样的,在这里我们只介绍gcc:
上图介绍了相关指令和参数以及该条指令所做的对应的事情。
- gcc -E filename.c -o filename.i
将c文件转化成C++文件,这个过程也叫做预处理过程 - gcc -S filename.i -o filename.s
将预处理过程生成的.i后缀的文件转化成汇编文件,里面存储的是相应的汇编代码,这个过程叫做编译。 - gcc -c filename.s -o filename.o
将汇编文件中的汇编代码翻译成相应的机器语言,这个过程叫做汇编。 - gcc filename.o -o filename.exe
这条指令是完成链接这个过程的,它通过链接器ld将运行程序的目标文件和库文件链接在一起,生成最后的可执行文件 - 生成可执行文件后,我们就能够调用相应的程序了。
注意:由于g++和gcc的用法相同,所以在这里我们就不直接介绍了
gcc和g++的区别
编译c程序
熟悉C++的人应该都知道,C++是C语言的超集,编写C/C++代码的时候,有人用gcc,也有人用g++,我们先来看看gcc和g++是否都能编译C++和C代码:
上图中,我们发现用gcc和g++分别编译test.c这个c文件,发现都是可执行的,实际上对于C文件gcc和g++所做的事情确实是一样的,g++在编译C文件时调用了gcc.
编译cpp程序
既然二者对c程序来说都一样的,那为什么两者都存在而不是只存在一个呢,不要着急,下面我们来看看他们分别是如何来编译C++程序的.
首先我们直接编译c文件生成可执行程序:
我们发现gcc报错,而g++没有报错,并且可以执行。
下面我们来看看它们的具体步骤以及错误原因:
- 预处理
在预处理阶段两条命令都能够成功,并且我们观察gcc和g++各自产生的.i后缀的文件,它们的内容都是相同的,所以我们能够发现gcc和g++在cpp程序中它们做了相同的事情。 - 编译
我们发现gcc编译test1.i(.cpp生成)的会出现大篇幅的错误,图片中的错误主要是说无法找到cout函数的库文件,而g++去可以通过编译并且生成汇编文件,这件事情说明gcc无法自动和c++的库文件进行连接,导致了库函数没有申明的错误. - 汇编
这个过程应该都没有问题,因为这个过程只是将后缀为.s文件中的汇编语言转换成了相应的机器语言。所以gcc和g++应该在这个过程中做了同样的事情。 - 链接
这个阶段也出现了问题,用gcc将.cpp后缀产生的.o文件转换成可执行文件时出现了错误,而g++却可以转换成功并且能够正确执行。这个还是因为gcc无法将库文件与.o后缀的文件关联在一起生成可执行程序,而g++可以完成这项工作。
总结
gcc和g++的区别主要是在对cpp文件的编译和链接过程中,因为cpp和c文件中库文件的命名方式不同,那为什么g++既可以编译C又可以编译C++呢,这时因为g++在内部做了处理,默认编译C++程序,但如果遇到C程序,它会直接调用gcc去编译.
Linux中g++与gcc的区别相关推荐
- Linux中线程和进程的区别
Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括 ...
- linux中系统调用和库函数的区别
linux中系统调用和库函数的区别 2013-05-03 22:18:20 分类: LINUX 首先,要说一下两者的概念: 系统调用 :是操作系统为用户态运行的进程和硬件设备(如CPU.磁盘.打印机等 ...
- Linux 中su 与su - 的区别
Linux 中su 与su - 的区别 一.区别 Linux 中切换用户的命令是 su 或 su - . su命令和 su - 命令最大的本质区别就是: 前者只切换了root身份 , 但是shell环 ...
- Linux中su与su - 的区别
Linux中su与su - 的区别 最近在学习任务调度执行,其中我要在轮子组下的一个用户,使用at并重定向,发现没有权限 下面是使用su [root@alytest ~]# su jack [jack ...
- Linux中EXT3与EXT4的区别!
在Linux系统中,日志文件系统分为很多种类型,其中比较典型的是:ext3.ext4.xfs等,那么Linux中EXT3与EXT4的区别有哪些?以下是详细的内容介绍. Linux Kernel自2.6 ...
- linux中hda和sda的区别
linux中hda和sda的区别 hda一般是指IDE接口的硬盘,hda一般指第一块硬盘,类似的有hdb,hdc等 sda一般是指SATA接口的硬盘,sda一般指第一块硬盘,类似的有sdb,sdc等 ...
- linux mkdir -m权限,Linux中mkdir和touch命令区别
一.目的 本文将介绍linux下新建文件或文件夹.删除文件或文件夹命令. touch能够新建文件,mkdir用来新建文件夹.rm用来删除文件或文件夹. 本文将选取ubu ...
- Linux 中 sudo和su的区别
Linux 中 sudo和su的区别 Linux小知识:sudo su和su的区别 1.内容不同: su命令:用来切换用户,substitute英文含义"代替"的意思. sudo命 ...
- linux中s权限大小写的区别,Linux中的权限
1.文件与目录权限 1)UID与GID ØUID UID是一个数值,是Linux系统中唯一的用户标识,用于区别不同的用户.在系统内部管理进程和文件保护时使用UID字段.在Linux系统中,注册名和UI ...
最新文章
- Anaconda+用conda创建python虚拟环境
- 下面不属于python第三方库的安装方法的是-Python第三方库安装和卸载
- C语言实用算法系列之学生管理系统_对整个结构体操作_冒泡排序_提取排序规则
- 1003 阶乘后面0的数量
- java与python反转Ture与False的方法
- python常见的数据结构
- LeetCode从读题到自闭:1. 两数之和
- 13幅逻辑图,领略杜克大学的经典思维
- 16种常用的数据分析方法-相关分析
- python饼状图显示其比例_Python学习笔记(matplotlib篇)--使用matplotlib绘制饼状图
- Python爬虫教程入门(附源码)
- 跨域 SameSite secure
- Java/大数据常见面试
- 爱情婚姻 - 苏格拉底
- 微信扫一扫下载apk 微信直接下载APK(APP)的解决方案
- 使用threejs开发微信小游戏全过程
- 2/8法则系列 | 你真的了解二八法则吗?
- 码元、码元速率、波特率、比特率理解
- 日期函数之Dateadd、Datediff
- 波动率和波动率曲面套利
热门文章
- Vue3.x 使用ref和reactive、toRef
- 'parent.relativePath' points at no local POM
- 如何将本地代码推送至远程仓库
- 代码版本管理 GitLab介绍
- 2019-12-31
- 前端_网页编程 Form表单与模板引擎(中)
- 小程序开发(12)-之分页封装
- 努比亚手机浏览器 安全证书失效_浏览器提示“该站点安全证书的吊销信息不可用”的解决方法-...
- mysql数据库group_key_【MySQL】数据库复制:组复制(Group Replication)
- 计算机专业英语第07章,计算机专业英语 -第7章1.ppt