生成一个可执行的文件通常需要经过以下几个步骤:

预处理你的源代码,去掉注释,以及其他技巧性的工作就像在 C 中展开宏。

检查代码的语法看你是否遵守了这个语言的规则。如果没有,编译器会给出 警告。

把源代码转换为汇编语言 ── 和机器代码很相似, 但是在一定情况下我们仍然可以理解。 [1]

把汇编语言转换为机器语言──是的,我们在说位元和字节,就是1和0。

检查你是否准确地使用了函数和全局变量类似的东西。例如,如果你调用了一个不存在的函数,编译器就会给出警告。

如果你是从多个源代码文件编译,就要学会如何把这些文件组合到一起。

把产生出来的东西用系统的运行装载器装入内存并运行。

最后,把可执行文件写入文件系统。

编译 这个词的意思通常指 1 到 4 步──其他的 步骤叫做 连接。有时侯第一步叫做 预处理 。第三和第四步叫做 汇编 。

幸运的是,几乎所有这些细节都是隐藏的,因为 cc 只是一个前端。它根据正确的参数调用程序来处理代码。只要输入

%

cc foobar.c

就会把 foobar.c 通过以上的步骤编译出来。如果你有多个文件要编译,只要输入

%

cc foo.c bar.c

注意,语法检查就是──纯粹的检查语法。而不会检测你可能犯的任何逻辑错误。比如无限循环,或者是你想用一元排序却使用了冒泡排序。 [2]

cc 有很多选项,在帮助手册中都可以找到。这里列出了一些最重要的选项,并且有例子。

-o filename

输出的文件名。如果你不使用这个选项,cc为产生 出一个叫 a.out 的执行文件。 [3]

%

cc foobar.c 可执行文件是

a.out

%

cc -o foobar foobar.c 可执行文件是

foobar

-c

仅仅编译文件,不会连接。如果你只想检查你写的测试程序的语法的话,这个选项非常有用。或者你会使用 Makefile。

%

cc -c foobar.c

这会产生一个 目标文件 (不可执行) 叫做 foobar.o。这个文件可以和其他的目标文件连接在一起构成一个可执行文件。

-g

产生一个可调试的可执行文件。编译器会在可执行文件中植入一些信息,这些信息能够把源文件中的行数和被调用的函数联系起来。在你一步一步调试程序的时候,调试器能够使用这些信息来显示源代码。这是 非常 有用的;缺点就是被植入的信息让程序变得更大。通常情况下,开 发一个程序的时候我们经常使用 -g,但是我们在编译一个 “release 版本” 的程序的时候,如果程序工作得让人满意了,我 们就不使用 -g 编译。

%

cc -g foobar.c

这会产生一个可调试版本的程序。 [4]

-O

产生一个优化版本的可执行文件。编译器会使用一些聪明的技巧产生出比普通编译产生的文件执行更快的可执行文件。可以在 -O 加上数字来使用更高级的优化。但是这样做经常会暴露出编译器的优化器中的一些 错误。例如,2.1.0 版本的 FreeBSD 中的 cc 在某些情况 下使用了 -O2 的话,会产生出错误的代码。

优化通常只在编译一个 release 版本的时候才被打开。

%

cc -O -o foobar foobar.c

这会产生一个优化版本的 foobar。

-O和 -O1指定1级优化

-O2 指定2级优化

-O3 指定3级优化

-O0指定不优化

$cc -c O3 -O0 hello.c

当出现多个优化时,以最后一个为准!!

-I

可指定查找include文件的其他位置.例如,如果有些include文件位于比较特殊的地方,比如/usr/local/include,就可以增加此选项如下:

$cc -c -I/usr/local/include -I/opt/include hello.c

此时目录搜索会按给出的次序进行.

-E

这个选项是相对标准的,它允许修改命令行以使编译程序把预先处理的C文件发到标准输出,而不实际编译代码.在查看C预处理伪指令和C宏时,这是很有用的.可能的编译输出可重新定向到一个文件,然后用编辑程序来分析:

$cc -c -E hello.c >cpp.out

此命令使include文件和程序被预先处理并重定向到文件cpp.out.以后可以用编辑程序或者分页命令分析这个文件,并确定最终的C语言代码看起来如何.

-D

允许从编译程序命令行定义宏符号

一共有两种情况:一种是用-DMACRO,相当于在程序中使用#define MACRO,另一种是用-DMACRO=A,相当于

程序中的#define MACRO A.如对下面这代码:

#ifdefine DEBUG

printf("debug message\n");

#endif

编译时可加上-DDEBUG参数,执行程序则打印出编译信息

下面的三个参数会迫使 cc 检查你的代码是否符合一些国际标准,经常被我们叫做 ANSI 标准,虽然严格的来说它是一个 ISO 标准。

-Wall

打开所有 cc 的作者认为值得注意的警告。不要只看这个选项的名字,它并没有打开所有 cc 能够注意到的所有警告。

-ansi

关闭大多数,但并不是所有,cc 提供的非 ANSI C 特性。不要只看选项的名字,它并不严格保证你的代码会兼容标准。

-pedantic

关闭 所有 cc 的非 ANSI C 特性。

没有这些选项,cc 能允许你按照标准使用一些非标准的扩展。有一些扩展非常有用,但不能与其他编译器兼容──实际上,这个标准的主要目的之一就是允许我们写出可以在任何系统上的由任何编译器编译的代码。这就叫做 可移植代码

通常来说,你应该让你的代码尽可能的可以移植。否则你就不得不完全重写你的代码以便能够在其他地方运行之──而且谁知道几年后你是否还会用它?

C语言编译cc,c语言编译过程及cc 的使用相关推荐

  1. c语言编译生成cpp,C语言的编译过程

    编译: 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序. 流程:C ...

  2. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  3. LLVM:Rust、Clang等语言的强大支持以及编译原理和过程

    新的开发语言如雨后春笋般涌现,比如 Mozilla 的 Rust.Apple 的 Swift 以及 Jetbrains 的 Kotlin 等等,当然很多好的语言也在不断迭代,比如 Java.这些语言为 ...

  4. makefile:带你了解一种常用于GNU gcc编译的工具语言

    摘要:该文章主要介绍makefile,一种常用语GNU gcc编译的工具语言,同时LiteOS也是利用该文件对工程项目进行make构建生成执行文件的. LiteOS源码中使用makefile进行文件的 ...

  5. Linux系统中编译大型C语言项目必备技能之:Makefile文件的编写

    文章目录 Makefile的介绍 Makefile的编写规范--简单举例 Makefile的编写规范--复杂举例 项目描述 编译需求 编译思路 Makefile的介绍 我们在阅读一些大型的C语言项目时 ...

  6. 大前端开发者需要了解的基础编译原理和语言知识

    转自:https://yq.aliyun.com/articles/180879 在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Py ...

  7. python语言的解释性特点指的是编写的程序不需要编译_解释性与编译型 Python2和python3的区别...

    一 基础: 1.解释型语言与编译型语言的区别 首先,我们编程都是用的高级语言(写汇编和机器语言的大牛除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算 ...

  8. Python编译成C语言,性能有多暴力?

    我这里用的Python环境是Anaconda3 2019.7 这里测试的程序是找出所有1000以内的勾股数. a∈[1, 1000],b∈[1, 1000], c∈[1, 1000] 满足a² + b ...

  9. ios上编译c语言的app,iOS App编译流程

    三大编译器详解GCC / Clang / LLVM 传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd).在编译过程中,前端主要负责词法和语法分 ...

  10. go编译成c语言,Go语言是怎么完成编译的

    Go语言是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕 ...

最新文章

  1. Springboot [日志管理LogBack]
  2. 2.1 帮助命令、用户管理、压缩
  3. TensorFlow前向传播
  4. 在MFC的picture控件中如何显示Mat图
  5. 无法在web服务器上启动调试 您不具备调试此应用程序的权限
  6. 洛谷 P2853 [USACO06DEC]Cow Picnic S-dfs
  7. razor java,如何在Razor中声明局部变量?
  8. App开发流程之创建项目和工程基本配置
  9. dubbo : Invalid multicast address 127.0.0.1, scope: 224.0.0.0 - 239.255.255.255
  10. 携程第二场预赛 1003:位图像素的颜色(水题,判断点是否在矩形内)
  11. ofo这事吧,其实也挺好的
  12. 追赶法 c++代码实现
  13. 家喻户晓的足力健,凭什么征服中老年人?
  14. shell脚本之俄罗斯方块
  15. 报错 Error from server (InternalError): an error on the server (““) has prevented the request from suc
  16. 命令式和声明式,哪个才是你的菜
  17. 红队渗透测试技术:如何通过鱼叉式网络钓鱼获得攻击机会?
  18. 软件工程 个人学习笔记(第三章)
  19. 基于ICP算法的三维点云数据拼接算法的实现
  20. Skype 不能开启

热门文章

  1. JS部分BOOM类封装函数
  2. 以下不是python内置函数的是_python课堂整理16---内置函数
  3. 超级好用的C++万能头文件
  4. nvidia linux屏幕撕裂,【技巧分享】你的Nvidia显卡在Win 7看视频画面撕裂没有?
  5. 有什么英语翻译器好用?
  6. 淘沙时代靠谱吗-淘宝私域流量指什么?怎么获得?
  7. kubernetes ingress更改日志格式
  8. Java面试考点思维导图
  9. 国民经济行业代码查询系统-公司行业代码查询
  10. mysql 中abs函数_Mysql常用函数