什么是c/c++编译
GCC是什么
GNU Compiler Collection的缩写,一开始是c语言的编译器,但现今可以支持多种语言的编译工作,也支持了多个硬件平台的编译。总而言之,主流的c语言编译器就是这个gcc了。
这里的GNU是一个软件项目名称,开发了很多的应用程序。
对于.c文件gcc当做c语言处理,g++(是gcc的c++编译器)当做c++处理;对于.cpp文件gcc和g++均当做c++处理;
编译过程

- 预处理
- 预处理主要解决的是将头文件、宏替换、条件编译给处理掉,include头文件之后,将头文件的代码插入了主代码(处理的.c文件),以及宏的内容给替换在代码文件中,还有将注释给处理掉。.c/cpp文件得到.i文件
- 编译分为了编译和汇编两个过程
- 编译器:对于c的话是直接gcc,对于c++就是g++;
- 编译将源程序进行词法和语法分析后,将高级语言指令转换为了等效的汇编语言,也就是.i文件得到.s文件。
a. 编译预处理,读取c程序,对其中伪指令和特殊符号进行处理
b. 编译优化处理,将提高效率 - 汇编:将汇编语言代码翻译成目标机器指令的过程,也就是.s文件会得到.o文件,得到一目标文件,这里的目标文件包括了两个段,代码段和数据段。
- 编译过后还有链接过程
- 因为在汇编程序生成的目标文件不能被立刻执行,往往有着很多没解决的问题,有些是文件的函数,存在引用了其他源文件的定义的函数或者是变量,所以就需要链接这个操作,就是将.o文件给链接抽象上聚集在一起,这一步也是为了后面能够生成可执行文件。

- 因为在汇编程序生成的目标文件不能被立刻执行,往往有着很多没解决的问题,有些是文件的函数,存在引用了其他源文件的定义的函数或者是变量,所以就需要链接这个操作,就是将.o文件给链接抽象上聚集在一起,这一步也是为了后面能够生成可执行文件。
.o与.so
一开始不太理解这个东西,在多次问和查询之后,有了点理解
- .o文件:在linux的ELF分类中,是属于可重定位的对象文件,o文件也是linux享同内的标准可执行文件之一,包括很多内核模块,也会用到这个。
- so文件,个人理解 so many o,简而言之,是整合链接了多个o文件,就形成了so文件。在linux内,so文件是所谓的动态库文件,也叫可被共享的对下个文件。这个文件的存在可以很好得释放了宝贵得物理内存,就是你要用到某些文件,才会链接去得到它,而不是全部放在linux系统上区占用额外得磁盘空间。
最后再贴下流程图

什么是c/c++编译的更多相关文章
- TODO:macOS编译PHP7.1
TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...
- Centos6.5下编译安装mysql 5.6
一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm -qa | grep mysql 有的话通过下面的命令来卸载掉 rpm -e mysql //普通删除模式 rpm -e ...
- CENTOS 6.5 平台离线编译安装 PHP5.6.6
一.下载php源码包 http://cn2.php.net/get/php-5.6.6.tar.gz/from/this/mirror 二.编译 编译之前可能会缺少一些必要的依赖包,加载一个本地yum ...
- CENTOS 6.5 平台离线编译安装 Mysql5.6.22
一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...
- Android注解使用之注解编译android-apt如何切换到annotationProcessor
前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ...
- Hawk 6. 编译和扩展开发
Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 在Windows上编译和调试CoreCLR
生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装 ...
- 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~
这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...
- Windows下Visual studio 2013 编译 Audacity
编译的Audacity版本为2.1.2,由于实在windows下编译,其源代码可以从Github上取得 git clone https://github.com/audacity/audacity. ...
随机推荐
- 10种常见OOM分析——手把手教你写bug
点赞+收藏 就学会系列,文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱,笔记自取 在<Java虚拟机规范>的规定里,除了程序计数器外,虚拟机内存的其他几个运 ...
- 数据湖应用解析:Spark on Elasticsearch一致性问题
摘要:脏数据对数据计算的正确性带来了很严重的影响.因此,我们需要探索一种方法,能够实现Spark写入Elasticsearch数据的可靠性与正确性. 概述 Spark与Elasticsearch(es ...
- Monster Audio 使用教程(四)Wifi 远程遥控
Android端下载二维码:(链接指向的是apk包地址,所以微信可能打不开,请用自带浏览器扫描二维码) IOS下载二维码: 安装好上面的app,确保你的移动端设备和你电脑连接的是同一个路由器(也就是 ...
- 一个完全关于android编程的技术博客网站
https://www.oschina.net/android/96/file-process
- expect正则捕获返回结果
expect正则捕获返回结果 expect: expect -re "([0-9]*)([a-zA-Z]*)"send_user "num is $expect_out( ...
- python自带函数
callable() #是否可以被执行,是否可以被调用 chr() #返回整数i对应的ASCII字符.与ord()作用相反.参数x:取值范围[0, 255]之间的正数. ord() #参数是一个asc ...
- KMP算法图解
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- PHP linkinfo() 函数
定义和用法 linkinfo() 函数返回有关一个硬连接的信息. 该函数返回设备 ID,如果失败则返回 FALSE. 语法 linkinfo(path) 参数 描述 path 必需.规定要检查的路径. ...
- C#后台实现在Grid标签中动态新增CheckBox标签(WPF中)
页面代码 <Grid Margin="45,0,10,0" > <Grid.RowDefinitions> <RowDefinition Height ...
- luoguP2154 [SDOI2009]虔诚的墓主人
SDOI2009虔诚的墓主人 喜闻乐见,我终于把此题读懂了..所以可以写了. 其实就是让我们求有多少个十字架 一个十字架的定义为中间有一个空地 周围4个正方向都有k棵树. 不难想到nm的暴力 我们预处 ...