c语言 自动化编译环境,《C编程.开始C》3.编译基础

在介绍了C编程的基本概念之后,我们现在可以简要地讨论编译过程。

像任何编程语言一样,C本身对于微处理器来说是完全不可理解的。它的目的是提供一种用于人类是提供一种能够很容易地转换成机器代码指令以直观的方式是理解到微处理器。该编译器是什么翻译我们人类可读的源代码转换成机器代码。

对于那些刚接触编程的人来说,这似乎相当简单。一个天真的编译器可能会读入每个源文件,将所有内容转换为机器代码,并写出可执行文件。这可行,但有两个严重的问题。首先,对于大型项目,计算机可能没有足够的内存来一次读取所有源代码。其次,如果对单个源文件进行更改,则必须重新编译整个应用程序。

为了解决这些问题,编译器将工作分解为步骤。对于每个源文件(每个.c文件),编译器读取文件,读取它通过#include指令引用的文件,并将它们转换为机器代码。结果是“目标文件”(.o)。创建所有目标文件后,“链接器”程序将收集所有目标文件并写入实际的可执行程序。这样,如果您更改了一个源文件,则只需要重新编译该文件,之后,需要重新链接该应用程序。

没有详细说明,对编译过程有一个肤浅的理解是有益的。

预处理器

预处理器提供了包含所谓的头文件,宏扩展,条件编译和行控制的能力。很多时候,您需要向编译器提供特殊指令。这可以通过在代码中插入预处理程序指令来完成。当您开始编译代码时,一个称为预处理器的特殊程序会扫描源代码,并根据预定义的规则为其他代码执行令牌字符串的简单替换。C预处理器不是C语言的一部分。

所有预处理程序指令都以井号字符(#)开头。您可以在Hello world程序中看到一个预处理程序指令。例:

#include

该指令使stdio标头包含在您的程序中。其他指令,如#pragma控制编译器设置和宏。预处理阶段的结果是文本字符串。您可以将预处理器视为非交互式文本编辑器,为编译准备代码。预处理程序指令的语言与C的语法无关,因此C预处理程序也可以独立用于处理其他类型的文本文件。

语法检查

此步骤确保代码有效并将序列化为可执行程序。在大多数编译器下,您可能会收到消息或警告,指出程序可能存在的问题(例如条件语句总是为真或假等)

当在程序中检测到错误时,编译器通常会报告阻止编译的文件名和行。

对象代码

编译器生成与源代码等效的机器代码,可以链接到最终程序中。此时代码本身无法执行,因为它需要链接才能执行。

在讨论编译是“单行道”的基础知识之后,请务必注意。也就是说,将C源文件编译成机器代码很容易,但“反编译”(将机器代码转换为创建它的C源代码)则不然。C的反编译器确实存在,但它们创建的代码很难理解,只对逆向工程有用。

链接

联通过集成库和代码并产生任一种结合了单独的对象文件合并为一个完整的程序的可执行程序或库。链接由链接器程序执行,该程序通常是编译器套件的一部分。

此阶段的常见错误是缺少或重复的功能。

自动化

对于大型C项目,许多程序员选择自动编译,以减少用户交互需求并通过重新编译仅修改过的文件来加快进程。

大多数集成开发环境都有某种项目管理,这使得这种自动化非常容易。但是,项目管理文件通常只能由同一集成开发环境的用户使用,因此任何希望修改项目的人都需要使用相同的IDE。

在类UNIX系统上,make和Makefiles通常用于完成相同的操作。Make是传统且灵活的,可作为大多数Unix和GNU发行版的标准开发人员工具之一。

GNU Autotools扩展了Makefile ,由Automake和Autoconf组成,用于使软件可编译,可测试,可翻译和可在许多类型的机器上配置。Automake和Autoconf在各自的手册中有详细描述。

Autotools通常被认为是复杂的,并且已经开发了各种更简单的构建系统。GNOME项目的许多组件现在使用声明性的Meson构建系统,该系统不太灵活,而是专注于以简单的方式提供构建系统中最常需要的功能。用C语言编写的程序的其他流行的构建系统包括CMake和Waf。

安装gcc后,可以使用已编写但尚未编译的c源文件列表调用它。例如,如果文件main.c包含myfun.h中描述的函数并在myfun_a.c和myfun_b.c中实现,那么就足够了

gcc main.c myfun_a.c myfun_b.c

myfun.h包含在main.c中,但如果它位于单独的头文件目录中,那么该目录可以在“-I”开关后列出。

在较大的程序中,Makefile和gnu make程序可以将c文件编译成以后缀.o结尾的中间文件,可以通过gcc链接。

如何编译每个目标文件通常在Makefile中描述,目标文件作为标签以冒号结尾,后跟两个空格(制表符经常导致问题),后面是依赖项的其他文件列表,例如.c文件和.c文件。 o在另一个部分编译的文件,在下一行,调用所需的gcc。打字 man make 或 info make经常提供如何使用make以及gcc所需的信息。虽然gcc有很多选项开关,但经常使用的是-g来生成gdb的调试信息,以允许gdb在机器代码程序的逐步执行期间显示源代码。gdb有一个’h’命令显示它可以做什么,如果a.out是由gcc编译的匿名可执行机器代码文件,它通常以’gdb a.out’开头。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

curd什么意思中文_查英英字典:What a shame是什么意思?

查英英字典:What a shame是什么意思?“互联网”时代学习英语有两种“学习方法”:简单粗暴学法和自己动手丰衣足食法。一、简单粗暴法:直接问老师要“中文答案”在过去非互联网时代,“老师”往往是提供“答案”的唯一渠…

一维搜索进退法c语言程序,基于c语言黄金分割法优化设计.doc

基于c语言黄金分割法优化设计基于c语言黄金分割法优化设计【摘 要】 机械优化设计是适应生产现代化要求发展起来的一门崭新的学科。它是在现代机械设计理论的基础上提出的一种更科学的设计方法,它可使机械产品的设计质量达到更高的要求。基于黄金分割法提出的利用C语…

c++读出像素矩阵_Python传numpy矩阵调c++(求3D图像连通区域)

Python有很多种调c的方法,有的复杂有的简单,有时使用的时候反而不知道到底该用哪一种比较好,其实没有最好的方法,只有适合不适合自己。本文从我所遇到的问题说起,然后讲述另一种比较简单的python调c并且传参numpy矩阵的…

android四大组件的作用简书,Android四大组件是什么

Android四大组件是:活动、服务、广播接收器、内容提供商。它们的英文名称是ACTIVITY、SERVICE、BroadcastReceiver、Content Provider。四个组件分别起到不同的作用,相互配合才能确保安卓系统的正常运行,因此是缺一不可的。Android四大组件及…

python 获取文件大小_第41p,超级重要,Python中的os库

大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第41篇文章,第二阶段的课程:Python基础知识:Python内置库之os库的使用。学习本课程,建议先看一遍:【计算机基础知识】课程。os模块是与操作…

android 多个textview,Android:多个textview像单个文本

需要格式化几个textview像一个又一个独特的文本块,有没有办法实现这个?Android:多个textview像单个文本这样__________________________| || || aaaaaa bbbbbbbbbbbbbbb || bbbbbbbbbb cccccc dddd || ddddddddddddd. || |我不能把TextView的…

惠普打印机节能环保认证证书_低成本高效办公 苏宁惠普超品日这几款打印机了解下!...

【PConline 导购】说到打印机,很多朋友会想到公司那台不停运转的打印机。其实,伴随着近几年来打印机技术的成熟,其打印成本也一降再降,这就让有打印的需求的中下型企业,甚至个人,都会去选购一款合适的打印产…

vm客户机隔离不能选_开汽车美容店,这些位置绝对不能选,会让你门可罗雀,生意惨淡...

之前的文章里,讲了一些开汽车美容店选址的要领,今天,来聊聊一些更加细致的选址要素,让你避免错误选址而导致生意不佳。门面宽度小于2.5米的不要选一辆普通汽车的宽度在1.8米-2米之间,加上两侧后视镜各20公分左右&#…

Android app 标签,android 获取APP的唯一标识applicationId的实例

使用getIdentifier()方法可以方便的获各应用包下的指定资源ID。方式一int indentify getResources().getIdentifier(“com.test.demo:drawable/icon”,null,null);第一个参数格式是:包名 : 资源文件夹名 / 资源名;是这种格式 然后其他的可以为null方式…

markdown格式_第1篇:如何将Markdown笔记转入ANKI复习? | 学习骇客

用技术和心理学改善学习 第128次摘要:将日常使用的Markdown笔记软件与复习工具ANKI结合起来,于ANKI用户而言可以简化学习过程,于一般的学习者而言可以解决笔记“记而不学”的问题。本文摘选自视频课程《复习的技术,跟LEO学ANKI》(…

android手机无分区无法刷机,手机刷死了别说没提醒!安卓设备刷机前必看

大家好,清明节已经过去了,上班的感觉是不是很不爽?但是告诉大家一个好消息是:本周只需要煎熬三天,大家就又可以休息了!听了这个消息,不爽的心情是不是稍微好一些了?本期的微信和大家…

python基础编程题、积分面积_Python基础编程题100列目录

实例001:数字组合 实例002:“个税计算” 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契数列 实例007:copy 实例008:九九乘法表 实例009:暂停…

mysqlbinlog工具_带你解析MySQL binlog

前言:我们都知道,binlog可以说是MySQL中比较重要的日志了,在日常学习及运维过程中,也经常会遇到。不清楚你对binlog了解多少呢?本篇文章将从binlog作用、binlog相关参数、解析binlog内容三个方面带你了解binlog。1.bin…

inputstream 初始化_如何完美回答面试官问的Mybatis初始化原理!

前言对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。本章将通过以下几点详细介绍MyBatis的初始化过程。MyBatis的初始化做了什么MyBatis基于XML配置文件创建Configuration对象的过程手动加载XML配置文件创建Configuration对象完成初…

html中加减号怎么输入,jQuery 实现点击加减号改变input标签中的value值,该怎么解决...

jQuery 实现点击加减号改变input标签中的value值我想点击左右两边的加减号,让中间input标签中的value属性值做出相应的改变,jQuery怎么实现?------解决思路----------------------$("button1").click(function(){var num $("…

java mybatis狂神说sql_狂神说MyBatis01:第一个程序

狂神说MyBatis系列连载课程,通俗易懂,基于MyBatis3.5.2版本,欢迎各位狂粉转发关注学习,视频同步文档。未经作者授权,禁止转载MyBatis简介环境说明:jdk 8 MySQL 5.7.19maven-3.6.1IDEA学习前需要掌握&#x…

鸿蒙系统暗黑2,暗黑破坏神2为什么被称为神作!看看装备强化系统就知道有多完美...

暗黑破坏神2之所以被玩家们称为神作是因为真的好玩,那么游戏的精髓到底在哪呢?个人觉得还要算其出色的装备强化系统,如果应用在现在的部分作品中,暗黑破坏神2的特色可以总结为肝,彻底肝。但它又区别于传统的必须肝&…

c语言api_用C语言来拓展python的功能

python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中。与其它…

html模拟在线股票走势,基于Html5的股票行情k线图源码

K线图 滑块控制这个K线图和flash实现的K线图非常接近,滑块控制是实现的难点,这里是根据滑块滑动的位置计算k线数据的范围,并实时重画,事实证明html5 canvas标签的性能还是相当的好的,在PC机上每秒可以重画20次以上&…

html5 css 三角形,css怎么画三角形?

css怎么画三角形?下面本篇文章就来给大家介绍一下使用CSS画三角形的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。css怎么画三角形?三角形实现原理:宽度width为0;height为0&#…