gcc入门教程
GCC使用说明
GCC使用手册及常用命令行GCC使用手册作者:Clock1.前言GCC编译器的手册(GCC MANUAL)的英文版已经非常全面,并且结构也非常完善了,只是一直都没有中文的版本,我这次阅读了GCC编译器的主要内容,对手册的内容进行了结构性的了解,认为有必要对这次阅读的内容进行整理,为以后的工作做准备。
由于我对这个英文手册的阅读也仅仅是结构性的。
因此有很多地方并没有看,所以这篇文档的内容我也只能写出部分,对于以后需要详细了解的地方,会再往这篇文档中增添内容,需要增添的内容主要是编译器的各种开关。
2. GCC功能介绍GCC编译器完成从C、C++、objective-C等源文件向运行在特定CPU硬件上的目标代码的转换(这是任何一个编译器需要完成的任务)。
GCC能够处理的源文件分为C、C++、Objective-C、汇编语言等。
对于这些源文件,用他们的后缀名进行标示。
GCC能够处理的后缀有:a. *.c *.C (C语言)b. *.cxx *.cc (C++语言)c. *.m (面向对象的C)d. *.i (预处理后的C语言源文件)e. *.ii (预处理后的C++语言源文件)f. *.s *.S (汇编语言)h. *.h (头文件)目标文件可以是:a. *.o 编译连接后的目标文件b. *.a 库文件编译器把编译生成目标代码的任务分为以下4步:a.预处理,把预处理命令扫描处理完毕;b.编译,把预处理后的结果编译成汇编或者目标模块;c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;d.连接,把多个目标代码模块连接生成一个大的目标模块;3. GCC开关GCC的运行开关共分为11类,这是类开关从11个方面控制着GCC程序的运行,以达到特定的编译目的。
3.1. 全局开关(OVERALL OPTIONS)全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如拟的目的是为了看某个CPU上的汇编语言怎么写)。
GCC快速入门(一)——基础知识
般 的 编 译 器 相 比 ,平 均 执 行 效 率 要 提 高 2 % ~3 %。 0 0 GCC是 GNU 项 目中 ̄ ANS IC标 准 的 编 译
JE P G压 缩 、 压 缩 测 试 , 快 可 解 最
维普资讯
口识 堂 掌
I技 I术 I讲 I座 I I I I
Li u n x下 许 多 编 译 程 序 、连 接 程 序 、工 具 和 图 形 化 的 用 户 界 面 环 境 等 都 由 GCC编 写 的 ,GCC 可 谓 程 序 开 发 的 基 础 编 译 器 。 文 将 分 三 讲 讲 解 如 何 快 速 步 入 GCC大 门 。第 一 讲 主 要 讲 解 与 GCC 本
ቤተ መጻሕፍቲ ባይዱ
器 ,可 以 把 源 代 码 编 译 成 在 其 它 硬件 平 台上 运 行 的 可 执行 代 码 。 用 GCC 编 译 后 生 成 的 代 码 与 一
PG C C ( Pent Um G C C , i
到 的 科 学 计 算 。 准 FO 标 RT RAN 函 数 库 ( 是 FoRTRAN 的 精 这
同 时 , GC C 还 是 一 个 交 叉 编 译
必 备 的一些 基础 知识 。
Auo o f Lb o l 。 它 们 是 tc n 和 it o 等 L n x操 作 系 统 外 层 的 图 形 界 面 iu
Ln x 行 版 本 选 择 i 发 u
在 L n x系 统 下 从 事 应 用 开 iu 发 , 先 应 该 有一 个合 适 的操 作 首 平 台 和 开 发 环 境 , 以选 择 和 安 所
《gcc编译器学习》word版
gcc编译器学习gcc and g++分别是gnu的c&c++编译器gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]4.连接目标代码,生成可执行程序[链接器ld]开始.首先,我们应该知道如何调用编译器。
实际上,这很简单。
我们将从那个著名的第一个C程序开始。
#include stdio.h int main(){printf("Hello World!\n");}把这个文件保存为game.c。
你可以在命令行下编译它:gcc game.c在默认情况下,C编译器将生成一个名为a.out的可执行文件。
你可以键入如下命令运行它:a.out Hello World每一次编译程序时,新的a.out将覆盖原来的程序。
你无法知道是哪个程序创建了a.out。
我们可以通过使用-o编译选项,告诉gcc我们想把可执行文件叫什么名字。
我们将把这个程序叫做game,我们可以使用任何名字,因为C没有Java那样的命名限制。
gcc-o game game.c game Hello World到现在为止,我们离一个有用的程序还差得很远。
如果你觉得沮丧,你可以想一想我们已经编译并运行了一个程序。
因为我们将一点一点为这个程序添加功能,所以我们必须保证让它能够运行。
似乎每个刚开始学编程的程序员都想一下子编一个1000行的程序,然后一次修改所有的错误。
没有人,我是说没有人,能做到这个。
你应该先编一个可以运行的小程序,修改它,然后再次让它运行。
这可以限制你一次修改的错误数量。
另外,你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。
这可以防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是不能运行。
请切记,能够通过编译的程序并不意味着它是正确的。
gcc的使用方法
gcc的使用方法GCC(GNU Compiler Collection)是一款由GNU开发的编程语言编译器集合,支持多种编程语言,如C、C++、Fortran等。
它被广泛用于各种操作系统和硬件平台上的软件开发,提供了强大的功能和灵活的配置选项。
本文将介绍GCC的基本使用方法,帮助读者快速上手。
一、安装GCC要使用GCC,首先需要在您的计算机上安装它。
GCC可以在多个操作系统上运行,包括Linux、Windows和Mac OS。
具体的安装方法因操作系统而异,下面将分别介绍。
1. 在Linux上安装GCC:在大多数Linux发行版中,GCC已经默认安装。
如果您的系统中没有安装GCC,您可以通过包管理器来安装它。
例如,在Debian或Ubuntu系统上,可以使用以下命令安装GCC:```sudo apt-get install gcc```其他Linux发行版的安装方法请参考相应的文档。
2. 在Windows上安装GCC:在Windows上,可以通过MinGW或MSYS2来安装GCC。
这两个工具集提供了一种在Windows环境中使用GCC的方式。
您可以从官方网站上下载并按照安装向导进行安装。
3. 在Mac OS上安装GCC:在Mac OS上,可以使用Homebrew或MacPorts来安装GCC。
这两个软件包管理系统可以让您以与Linux相似的方式在Mac OS上安装软件。
例如,使用Homebrew安装GCC的命令如下:```brew install gcc```其他安装方法请参考相应文档。
二、编写源代码安装好GCC后,我们就可以开始编写源代码了。
GCC支持多种编程语言,但本文以C语言为例进行介绍。
打开任何文本编辑器,创建一个后缀名为.c的文件,并编写您的C 源代码。
例如,创建一个名为`hello.c`的文件,其中包含以下代码:```c#include <stdio.h>int main() {printf("Hello, world!\n");return 0;}```三、编译和运行代码一旦您编写好了源代码,接下来就可以使用GCC将其编译成可执行文件。
gcc8 编译
GCC (GNU Compiler Collection) 是一个开源的编译器,用于将源代码转换为可执行文件。
GCC 支持多种编程语言,包括 C、C++、Fortran、Ada 等。
如果你想要使用 GCC 8 版本编译你的程序,可以按照以下步骤进行操作:
1. 安装 GCC 8:首先,你需要从官方网站下载并安装 GCC 8。
你可以根据你的操作系统选择适合的安装包。
2. 配置环境变量:安装完成后,确保 GCC 的路径已经添加到系统的环境变量中。
这样,你就可以在任何地方使用 gcc 和 g++ 命令来编译你的程序。
3. 编写源代码:使用你喜欢的文本编辑器编写源代码文件,例如 main.c 或 main.cpp。
4. 编译源代码:打开终端或命令提示符,导航到源代码所在的目录,然后使用 gcc 或 g++ 命令进行编译。
例如:
```bash
gcc main.c -o main
```
或者对于 C++ 文件:
```bash
g++ main.cpp -o main
```
-o main` 表示输出文件名为 main,你可以根据需要更改输出文件名。
5. 运行可执行文件:编译成功后,你可以运行生成的可执行文件。
在终端或命令提示符中输入以下命令:
```bash
./main
```
这将在终端或命令提示符中运行你的程序。
这些是使用 GCC 8 编译程序的简要步骤。
当然,还有其他一些高级选项和功能可供使用,你可以参考 GCC 的文档或手册来了解更多详细信息。
gcc 用法
gcc 用法GCC (GNU Compiler Collection) 是一套自由软件编译器,可以用于编译多种编程语言的源代码,包括 C、C++、Objective-C、Fortran、Ada 和其他一些语言。
GCC 是GNU计划的一部分,由自由软件基金会维护和发展。
本文将详细介绍 GCC 的使用方法。
一、环境准备在使用GCC之前,需要先安装好GCC。
GCC是开源软件,常见的Linux发行版都默认安装GCC,Windows下可以通过安装Cygwin或MinGW等方式安装GCC。
安装完成后,在命令行中输入gcc --version查看gcc的版本号确认是否安装成功。
除了GCC之外,还需要一个文本编辑器来编写源代码。
Windows下常用的文本编辑器有Notepad++,Linux下则使用vim或emacs等编辑器。
还需要了解一些基本的编程知识和语法。
二、GCC 编译 C 语言程序以下是一个简单的 C 语言程序,可以输出 "Hello, world!":```c#include <stdio.h>printf("Hello, world!\n");return 0;}```将上述代码保存为 helloworld.c 文件,然后在命令行中进入文件所在目录,输入以下命令编译该程序:```gcc helloworld.c -o helloworld```gcc是编译器的命令,helloworld.c是待编译的源代码文件名,-o helloworld是生成的可执行文件名。
执行上述命令后,GCC 会把源代码编译成可执行文件 helloworld。
运行该可执行文件,可以得到以下输出:```Hello, world!```三、GCC 编译 C++ 程序GCC 也可以编译 C++ 程序,以下是一个简单的 C++ 程序,可以输出 "Hello,world!":```c++#include <iostream>std::cout << "Hello, world!" << std::endl;return 0;}```将上述代码保存为 helloworld.cpp 文件,然后在命令行中进入文件所在目录,输入以下命令编译该程序:```g++ helloworld.cpp -o helloworld```g++是编译器的命令,helloworld.cpp是待编译的源代码文件名,-o helloworld是生成的可执行文件名。
GCC快速入门(三)——GCC调试和优化技巧
p : 告 诉 GCC 序 里 加 gi  ̄项 程 2 应 用 实 例 . 下 面 通过 一 个 具 体 的实 例 说 明 如 何 利 用 调 试 符 号 来 分 析 错 误 ,所 用 程 序 d b g e u me C如 下 .
入 额 外 的 代 码 ,执 行 时 ,产 生 g r f 的剖 析 信 息 ,以 显示 程 po用 序 的耗 时 情 况 。
G C调试和优化 技巧 C
■ 曾 江 华
G C调 试 常 用 选 项 C
GCC支 持 数 种 调 试 和 剖 析 选 项 , 这 些 选 项里 经 常 会用 到 的 在
是 一g和 P g选 项 。
一
惟 一 的 办法 就是 添 加 大量 的语 句 来产 生 特 定 的输 出 。 GDB的 出 现 减 轻 了 开 发 人 员 的 负 担 ,他 们 可 以在 程 序 运 行 的 时 候 单 步 跟 踪 自 己 的 代 码 ,或 者 通 过 断 点 暂 时 中 止 程 序 的 执 行 ,还 能 够 随 时 察 看 变 量 和 内 存 的 当 前 状 态 ,并 监 视 关 键 的数 据结 构 是如 何 影响 代 码 运行的。 GDB提 供 了 下 列 功 能 : ◆监 视 程 序 中变 量 的值 t ◆设 置 断 点 ,使 程序 在 指 定 的代 码 行上 停 止 执 行 t ◆ 可 以一 行 行地 执 行 代 码 t ◆ 动 态 地 改 变 程 序 的 执 行 环境 。
行 编译 ,同时 产 生调 试符 号 :
# gc -g e  ̄ T e. -0 c d b n C
d b q e e  ̄ n
使 用 G B调 试 程 序 D
1G . DB基 础 G C C 组 件 包 含 了 一 个 叫
linuxgcc命令及用法
linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
编程_gcc使用的方法
编程_gcc使用的方法gcc使用的方法1。
gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译2。
gcc的基本用法gcc test.c这样将编译出一个名为a.out的程序gcc test.c -o test这样将编译出一个名为test的程序,-o参数用来指定生成程序的名字3。
为什么会出现undefined reference to 'xxxxx'错误?首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm。
4。
-l参数和-L参数-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。
好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。
放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。
gcc编译c语言代码
编译C语言代码使用GCC(GNU Compiler Collection)的基本步骤如下:1. 创建C源文件:使用文本编辑器(如vim、notepad++、Visual Studio Code等)创建一个C语言源文件,通常文件扩展名为.c。
例如,你可以创建一个名为hello_world.c 的文件,并在其中输入以下代码:c代码:2. 保存源文件:保存你在步骤1中创建的C源文件。
3. 打开终端或命令提示符:在你的操作系统中打开终端(Linux、macOS)或命令提示符(Windows)。
4. 导航到源文件目录:使用cd命令导航到包含你的C源文件的目录。
例如,如果你的源文件位于Documents/c_projects目录下,可以使用以下命令:bash代码:5. 编译源文件:使用GCC编译器编译你的C源文件。
基本的编译命令格式为:bash代码:其中,-o选项后面是你要生成的可执行文件的名称,source_file.c是你的C源文件名。
例如,如果你的源文件名为hello_world.c,并且你想要生成一个名为hello 的可执行文件,可以使用以下命令:bash代码:6. 运行可执行文件:如果编译成功,你可以在同一目录下看到生成的可执行文件(在这个例子中是hello)。
运行可执行文件,查看程序输出:bash代码:这将输出:"Hello, World!"。
注意:在某些情况下,你可能需要添加额外的编译选项,例如-Wall (启用所有警告)或-g (包含调试信息)。
这些选项可以在gcc命令后面添加,用空格分隔。
例如:bash代码:以上就是使用GCC编译C语言代码的基本步骤。
根据你的具体需求和环境,可能需要进行一些调整。
gcc的四个步骤
gcc的四个步骤第一步:预处理预处理是GCC的第一个步骤,也是代码编译过程的第一步。
在预处理阶段,预处理器将根据一些特殊的预处理指令,对源代码进行一系列的处理,包括宏扩展、头文件包含、条件编译等等。
预处理的目的是提前处理一些不会因代码中的变化而改变的内容,为后续的编译步骤做准备。
预处理器首先会替换代码中的宏定义,将宏名称替换为其对应的宏代码。
然后进行头文件包含,将头文件中的内容插入到源文件中。
预处理器还会处理条件编译指令,根据条件对代码进行选择性编译。
最后生成一个经过预处理的中间文件,供下一步的编译使用。
第二步:编译编译是GCC的第二个步骤,也是代码编译过程的核心。
在编译阶段,编译器将预处理得到的中间文件进一步处理,将其转换为汇编语言代码。
编译器会对代码进行一系列的语法分析、语义分析、优化等操作,以保证代码的正确性和性能。
语法分析是指编译器对源代码进行词法分析和语法分析,将代码分解为基本的语法单元,并构建语法树。
语义分析是指编译器对语法树进行类型检查、语义检查等操作,确保代码的合法性和一致性。
优化是指编译器对代码进行一系列的优化操作,以提高代码的执行效率。
编译器将经过处理的代码转换为汇编语言代码,并生成一个汇编语言文件,作为下一步的汇编过程的输入。
第三步:汇编汇编是GCC的第三个步骤,也是代码编译过程的重要一环。
在汇编阶段,汇编器将编译得到的汇编语言文件进行处理,将其转换为机器码或者可重定位文件。
汇编器将汇编语言代码按照特定的指令格式和地址方式进行翻译,生成与特定处理器架构相兼容的机器码。
汇编器首先会解析汇编语言指令,将其转换为二进制机器码指令。
然后将地址符号转换为实际地址,生成指令和数据的链接关系。
最后生成一个与目标处理器兼容的机器码文件或可重定位文件。
第四步:链接链接是GCC的最后一个步骤,也是代码编译过程的最后一环。
在链接阶段,链接器将多个汇编产生的可重定位文件进行处理,将其合并成一个单一的可执行文件。
初次接触GCC因此花费了我不少时间搞了半天加一个晚上终于能编译
初次接触GCC因此花费了我不少时间,搞了半天加一个晚上终于能编译成功了!^_^先是安装《PN的配置与GCC 入门》操作了一遍,没有成功,之后在论坛了找啊找啊,找了hotpower的一篇文档,两者一结合,ok了,呵呵。
为了更好的方便象我一样的初学者,现在把我操作的一系列步骤写下来,给初学者一个参考。
1、安装WinA VR, 我按照其默认的状态安装的。
(省力省心,^_^)2、打开Programmers Notepad,先不要着急新建什么工程,编写什么程序。
按照《PN的配置与GCC 入门》配置一下字体显示和一些工具。
我配置的工具如下:小弟用的是双龙的下载软件。
当然在配置Makefile Wizard 时,要把C:\WinAVR\bin目录下的wish84.exe,tcl84.dll,tk84.dll三个文件复制到C:\WinAVR\mfile目录下,然后用PN打开该目录下的mfile.tcl文件,并按照下图修改。
如果WinAVR不是按默认目录安装的,假如安装到了D:/program/ 下,则上图中圈中的地方要改为set prefix “D:/program/WinAVR/mfile/”.同样工具配置的第一幅图中command和parameters 栏都要改到相应的目录下面。
以上配置基本完成,下面进入实战阶段。
3、在Programmers Notepad中,点击File->new->project 新建一工程项目,可取名为test.pnproj 如图4、 新建文件,点击File->New->Default,5、 在编辑区内编写自己的程序代码,并保存到刚才新建Project 的目录下面,取名为test.c 记住一定要保“.c ”的格式,否则没有语法显示。
之后整个界面如下所示:我所加的代码是我随便找的,代码是马老师的SPI主机的发送和接收一个字节的程序。
(做了一点修改)代码如下:#include <avr/io.h>#include <stdio.h>#include <avr/signal.h>#include <avr/interrupt.h>//#define unsigned char uchar#define SIZE 100unsigned char SPI_rx_buff[SIZE];unsigned char SPI_tx_buff[SIZE];unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;unsigned char tx_wr_index,tx_rd_index,tx_counter,SPI_ok;unsigned char t10mscnt;unsigned char t500mscnt;unsigned char senddata;void mcu_ini(void){unsigned char temp;cli();MCUCR = 0x00; //disable all interruptsDDRA=0xff;PORTA=0x00;DDRC=0xff;PORTC=0x00;DDRD=0xff;PORTD=0x00;TCCR0 = 0x00; //stopTCNT0 = 0x06; //set count 250usOCR0 = 0x64; //set compareTCCR0 = 0x02; //start timerDDRB |= 0xBF; //MISO=input and MOSI,SCK,SS = outputPORTB |= 0x40; //MISO上拉电阻有效SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率SPSR = 0x00;temp = SPSR;temp = SPDR; //清空SPI,和中断标志,使SPI空闲SPI_ok = 1;MCUCR = 0x00;GICR = 0x00;TIMSK = 0x01; //timer interrupt sourcessei(); //re-enable interrupts}//#pragma interrupt_handler timer0_ovf_isr:10SIGNAL(SIG_OVERFLOW0){//250usTCNT0 = 0x06; //reload counter valueif(++t10mscnt>=40){t10mscnt=0;if(++t500mscnt>=50){senddata++;if(senddata>=16)senddata=0;t500mscnt=0;}}}//===========================//#pragma interrupt_handler master_spi_isr:11SIGNAL(SIG_SPI){SPI_rx_buff[rx_wr_index] = SPDR; //从ISP口读出收到的字节SPI_ok = 1; // SPI 空闲if (++rx_wr_index == SIZE) rx_wr_index = 0; //放入接收缓冲区,并调整队列指针if (++rx_counter == SIZE){rx_counter = 0;rx_buffer_overflow = 1; //接收缓冲区溢出}if (tx_counter) //如果发送缓冲区中有待发的数据tx_counter==0表示没有数据要发送{--tx_counter;SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针if (++tx_rd_index == SIZE)tx_rd_index = 0;SPI_ok = 0;}}//----------------------------------------unsigned char getSPIchar(void){unsigned char data;while (rx_counter == 0); //无接收数据,等待data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据if (++rx_rd_index == SIZE)rx_rd_index = 0; //调整指针cli();--rx_counter;sei();return data;}//------------------------------------------void putSPIchar(char c){while (tx_counter == SIZE);//发送缓冲区满,等待cli();if (tx_counter || SPI_ok==0 ) //发送缓冲区已中有待发数据{ //或SPI正在发送数据时SPI_tx_buff[tx_wr_index] = c; //将数据放入发送缓冲区排队if (++tx_wr_index == SIZE)tx_wr_index = 0; //调整指针++tx_counter;}else{SPDR = c; //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送SPI_ok = 0; //}sei();}//--------------------------------------------/*void spi_init(void){unsigned char temp;DDRB |= 0xB0; //MISO=input and MOSI,SCK,SS = outputPORTB |= 0xB0; //MISO上拉电阻有效SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率SPSR = 0x80;temp = SPSR;temp = SPDR; //清空SPI,和中断标志,使SPI空闲SPI_ok = 1;}*///---------------------------------------------------int main(void){unsigned char i;i=0;mcu_ini();//CLI(); //关中断//spi_init(); //初始化SPI接口//SEI(); //开中断while(1){putSPIchar(i); //发送一个字节//i++;putSPIchar(i++);putSPIchar(i++);getSPIchar(); //接收一个字节(第一个字节为空字节)getSPIchar();getSPIchar();//………}}6、至此代码别写完成,(呵呵,抄来的,别抽我)接下来就要做编译了。
gcc编译c++程序的过程
GCC(GNU Compiler Collection)是一个开源的编译器,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。
下面是使用GCC编译C++程序的一般步骤:
1. **编写源代码**:首先,你需要编写C++源代码文件,通常以`.cpp`为扩展名。
2. **预处理**:GCC首先会进行预处理,这一步会处理源文件中的预处理指令,比如#include、#define等。
GCC会扩展这些指令,并将结果输出到临时文件。
3. **编译**:接下来,GCC会将预处理后的代码进行编译。
编译是将源代码转换成机器代码的过程。
在这一步中,GCC会将C++代码转换成汇编语言。
4. **汇编**:然后,GCC会使用汇编器将上一步生成的汇编代码转换成目标文件(通常是`.o`文件)。
5. **链接**:最后,GCC会进行链接步骤。
链接是将目标文件和所需的库文件合并成一个可执行文件的过程。
在这个过程中,GCC还会处理符号引用和地址解析等问题。
如果你在命令行中运行GCC编译C++程序,可以使用如下命令:
```bash
gcc -o output_file source_file.cpp
```
其中,`-o`选项用于指定输出文件的名称,`source_file.cpp`是源代码文件的名称。
在编译完成后,GCC会生成一个名为`output_file`的可执行文件。
需要注意的是,GCC还支持许多其他选项和参数,可以用来优化编译过程、控制警告和错误处理等。
你可以通过运行`gcc --help`命令来查看所有可用的选项和参数。
C语言入门教程1
C语言是一种广受欢迎且用途广泛的程序设计语言。
人们使用它编写计算机程序。
因为C功能强、效率高,所以全世界的程序员都喜欢用它。
如果您是一名程序员,或者希望成为一名程序员的话,那么学习C语言会使您受益匪浅:本文中,我们将会循序渐进地完整介绍C语言,并教会您怎样从零起步成为一名C程序员。
一旦您掌握了C语言,您一定会对自己可以做的事情感到吃惊的!C是一种计算机编程语言。
就是说可以用C编写指令清单交给计算机去执行。
C是当前正在使用的成千上万种编程语言之一。
它已经有几十年的历史了。
因为它功能强大而且效率很高,所以受到了程序员们广泛的欢迎。
C还是一种容易学习的语言。
和其他一些语言相比,C的风格稍有点古怪,但您会很快适应的。
HSWC语言编译器C 是所谓的编译型语言,意思是说您写好的源程序必须通过C编译器来运行,使它变成可以在计算机上运行(执行)的可执行文件。
C源程序是供人阅读的,而编译器产生的可执行程序是供计算机读入和执行的。
也就是说,要编写并运行一个C程序,您必须借助于C编译器。
如果使用UNIX系统(例如,您在UNIX主机上用C编写CGI脚本,或者您是学生,在实验室的UNIX机器上工作),C编译器是免费提供的。
它的名字是cc或者gcc,可以通过命令行调用。
您如果是学生,那么学校很可能会向您提供编译器。
您只要查一下学校提供什么样的编译器并学习使用即可。
如果您是在家使用Windows操作系统的计算机,则需要下载免费的C编译器或是购买商业的C编译器。
微软公司的Visual C++是一套广泛使用的商业编译环境,可以编译C和C++程序。
可惜这套软件要花费几百美元。
如果不想花那么多钱购买商业编译器的话,那么您可以在网上挑选一款免费的编译器。
如果您想找的话,不妨从/djgpp/开始吧。
我们会从一个极其简单的C语言程序为例开始,循序渐进。
在这个例子中,我假定您使用的是UNIX命令行,并以gcc作为您的开发环境。
如果您使用的并不是这些,所有的代码依然可以正常运行——您只是需要使用其他可用的编译器,才能理解这些代码。
GCC新手入门
Gcchowto目录[隐藏]∙ 1 准备工作∙ 2 编译简单的C 程序∙ 3 捕捉错误∙ 4 编译多个源文件∙ 5 简单的Makefile 文件∙ 6 链接外部库∙7 编译C++与Fortran∙8 其他参考本文翻译自An Introduction to GCC的部分章节(有改动)。
[编辑]准备工作注意:本文可能会让你失望,如果你有下列疑问的话:为什么要在终端输命令啊?GCC 是什么东西,怎么在菜单中找不到?GCC 不能有像VC 那样的窗口吗?…… 那么你真正想要了解的可能是anjuta,kdevelop,geany,code blocks,eclipse,netbeans 等IDE 集成开发环境。
即使在这种情况下,由于GCC 是以上IDE 的后台的编译器,本文仍值得你稍作了解。
如果你还没装编译环境或自己不确定装没装,不妨先执行sudo apt-get install build-essential如果你需要编译Fortran 程序,那么还需要安装gfortran(或g77)sudo apt-get install gfortran[编辑]编译简单的C 程序C 语言经典的入门例子是Hello World,下面是一示例代码:#include <stdio.h>int main(void){printf("Hello, world!\n");return0;}我们假定该代码存为文件‘hello.c’。
要用gcc编译该文件,使用下面的命令:$ gcc -g -Wall hello.c -o hello该命令将文件‘hello.c’中的代码编译为机器码并存储在可执行文件‘hello’中。
机器码的文件名是通过-o选项指定的。
该选项通常作为命令行中的最后一个参数。
如果被省略,输出文件默认为‘a.out’。
注意到如果当前目录中与可执行文件重名的文件已经存在,它将被覆盖。
选项-Wall开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。
C语言详细教程完整版
C语言详细教程完整版C语言是一种广泛使用的高级编程语言,具有强大的灵活性和高效的执行能力。
它被广泛应用于系统软件开发、嵌入式系统以及科学计算等领域。
本教程将为你详细介绍C语言的基本概念、语法规则和常用函数,帮助你全面掌握C语言编程技巧。
一、C语言简介C语言由美国计算机科学家丹尼斯·里奇于1972年在贝尔实验室开发而来。
它是一种面向过程的编程语言,注重代码的可读性和可维护性。
C语言具有强大的表达能力和灵活性,深受程序员喜爱。
二、环境搭建在学习C语言之前,首先需要搭建一个合适的编程环境。
你可以选择在Windows、Linux或Mac OS上安装C语言开发环境。
常用的C语言编译器有GCC、Clang等,它们可以将C语言代码转换成可执行文件。
三、基本语法1. 数据类型C语言提供了多种数据类型,包括整型、浮点型、字符型以及自定义的结构体和枚举等。
你可以根据需要选择合适的数据类型来存储和操作数据。
2. 变量与常量在C语言中,变量用于存储数据,而常量是不可修改的固定值。
你可以使用关键字来声明变量,并通过赋值运算符给变量赋初值。
常量可以直接使用字面值或宏定义来表示。
3. 运算符C语言支持多种运算符,包括算术运算符、关系运算符、逻辑运算符和赋值运算符等。
运算符可以用于完成各种基本运算操作。
4. 控制结构C语言提供了多种控制结构,包括条件语句、循环语句和跳转语句等。
通过控制结构,你可以实现条件判断、循环执行和程序流程控制等功能。
四、函数与库1. 函数函数是C语言程序的基本组成单位,可以将程序划分为多个独立的功能模块。
通过函数,你可以使程序结构更加清晰、模块化,便于代码的维护和重用。
2. 库C语言提供了各种标准库和用户自定义库,包括输入输出库、数学库、字符串处理库等。
通过调用库函数,你可以实现更丰富的功能,提高程序的效率和可靠性。
五、常用技巧与实例1. 数组与字符串处理C语言提供了灵活的数组和字符串处理功能,你可以通过数组来存储一组数据,并使用字符串函数来进行字符串操作。
c语言入门教程
c语言入门教程C语言是一种面向过程的编程语言,也是许多编程语言的基础。
学习C语言可以帮助我们更好地理解计算机编程的基本原理和逻辑。
下面是一个简单的C语言入门教程。
1. 安装C语言编译器首先,我们需要安装C语言编译器。
常见的C语言编译器有GCC、Clang等。
可以在官方网站上下载并按照说明进行安装。
2. 编写一个Hello World程序打开一个文本编辑器,输入以下代码:```#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}```保存文件为`hello.c`。
3. 编译和运行程序打开命令行终端,进入保存`hello.c`文件的目录,执行以下命令进行编译:```gcc -o hello hello.c```编译成功后,会生成一个可执行文件`hello`。
执行以下命令运行程序:```./hello```如果一切正常,你将会看到输出`Hello, World!`。
4. 理解代码代码中的`#include <stdio.h>`是一个预处理指令,用于包含stdio库的定义,其中定义了一些输入输出函数,如`printf`。
`int main()`是一个函数的定义,表示程序的入口函数。
在C语言中,所有的程序必须有一个入口函数,并从这个函数开始执行。
`printf("Hello, World!\n");`是一个输出函数,用于在控制台输出`Hello, World!`。
`printf`函数使用格式化字符串的方式输出内容。
`return 0;`表示返回一个整数值0,这个值会被操作系统作为程序的返回值。
5. 进一步学习通过以上简单的示例,你已经初步了解了C语言的基本语法和编写程序的步骤。
下一步,你可以学习更复杂的语法,如变量、运算符、流程控制语句等。
可以参考一些优秀的C语言教程或者书籍,如《C Primer Plus》、《C语言程序设计》等。
GCCP6操作快速指南
GCCP6操作快速指南1. 准备工作在开始使用GCCP6之前,请确保您的开发环境满足以下要求:- 安装Java JDK 1.8或以上版本- 安装Maven 3.6或以上版本- 安装Git 2.14或以上版本- 配置好SSH密钥,以便于使用Git进行代码管理2. 创建项目在GCCP6平台上创建项目,请按照以下步骤进行:1. 登录GCCP6平台。
如果您还没有账号,请先注册。
2. 在主页面点击“创建项目”按钮。
3. 填写项目名称、描述和选择项目模板。
4. 选择云服务提供商(如阿里云、腾讯云等)。
5. 配置项目环境,如CPU、内存、存储等。
6. 点击“创建项目”按钮,等待项目创建完成。
3. 开发应用在项目创建完成后,您可以开始开发云原生应用。
以下是基本的开发流程:1. 编写代码:使用您熟悉的编程语言(如Java、Python等)编写应用代码。
2. 构建项目:使用Maven或Gradle等构建工具进行项目构建。
3. 测试应用:在本地环境进行单元测试和集成测试。
4. 打包应用:将应用打包成适合在云端运行的格式,如Docker 镜像。
4. 部署应用将编写和测试好的应用部署到GCCP6平台,请遵循以下步骤:1. 上传镜像:在GCCP6平台的镜像管理中上传打包好的Docker镜像。
2. 创建服务:在GCCP6平台的服务管理中创建一个新的服务。
3. 配置服务:选择刚刚上传的镜像,配置服务所需的CPU、内存、存储等资源。
4. 部署服务:点击“部署”按钮,GCCP6平台将自动创建所需资源并部署应用。
5. 管理应用在应用部署后,您需要对其进行管理和监控,以确保其稳定运行。
以下是管理应用的基本方法:1. 监控应用:在GCCP6平台的监控管理中查看应用的运行状态、CPU使用率、内存使用情况等。
2. 日志管理:在日志管理中查看应用的输出日志,以便于排查问题和定位故障。
3. 更新和扩缩容:根据需求对应用进行更新和扩缩容操作。
6. 清理资源当您完成应用的开发、部署和管理后,请确保清理所有使用的资源,以避免产生不必要的费用。
gcc编译c文件并运行的方法
gcc编译c文件并运行的方法GCC是一款广泛使用的编译器,可用于编译多种编程语言,包括C语言。
它是一个开源软件,可以在多种平台上使用,如Linux、Windows和Mac OS等。
GCC编译器可以将C语言程序源代码编译为计算机可以执行的机器代码,这些机器代码可以在计算机上直接运行。
本文将介绍如何使用GCC编译C语言程序,并在计算机上运行它们。
步骤1:安装GCC编译器要使用GCC编译C语言程序,首先需要安装GCC编译器。
在Linux系统上,可以使用以下命令来安装GCC:```sudo apt-get install build-essential```在Windows系统上,可以下载MinGW安装包进行安装。
MinGW(Minimalist GNU for Windows)是一套在Windows上使用GCC编译器的工具集。
在Mac OS系统上,可以使用Homebrew包管理器来安装GCC编译器。
在终端上输入以下命令:```brew install gcc```步骤2:编写C语言程序要编译和运行C语言程序,首先需要编写一个C源代码文件。
C源代码文件通常以“.c”为扩展名。
可以编写一个简单的“hello world”程序,并将其保存为“hello.c”文件。
下面是一个示例程序:```#include <stdio.h>printf("Hello, World!");return 0;}```步骤3:使用GCC编译器编译C语言程序一旦编写好了C语言程序,就可以使用GCC编译器将其编译为可执行程序。
在终端上,进入C语言程序所在目录,并使用以下命令编译程序:```gcc -o hello hello.c```在这个命令中,“-o”参数指定编译器编译完后生成的可执行文件的名称。
在本例中,编译器将生成一个名为“hello”的可执行文件。
步骤4:运行已编译的C语言程序执行上述编译命令后,GCC编译器将生成一个可执行文件。
gcc编译入门实例
gcc编译⼊门实例⼀、简介gcc编译共分为4个步骤:(以test.c为例)step1:执⾏预处理,⽣成后缀.i的⽂件[预处理器c] gcc -E test.c -o test.istep2:将预处理后的⽂件不转换成汇编语⾔,⽣成⽂件.s[编译器egcs] gcc -S test.c -o test.sstep3:将汇编代码变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as] gcc -c test.c -o test.ostep4:链接⽬标代码,⽣成可执⾏程序[链接器ld] gcc -o test test.o⽤图来表⽰如下:⼆、编译参数gcc有很多编译参数可供我们选择,如下:-c 只激活预处理,编译,和汇编,也就是他只把程序做成obj⽂件.例⼦⽤法: gcc -c hello.c (他将⽣成.o的obj⽂件)-S 只激活预处理和编译,就是指把⽂件编译成为汇编代码。
例⼦⽤法: gcc -S hello.c (他将⽣成.s的汇编代码,你可以⽤⽂本编辑器察看 )-E 只激活预处理,这个不⽣成⽂件,你需要把它重定向到⼀个输出⽂件⾥⾯.例⼦⽤法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more (慢慢看吧,⼀个hello word 也要与处理成800⾏的代码 )-o 制定⽬标名称,缺省的时候,gcc编译出来的⽂件是a.out,很难听,如果你和我有同感,改掉它,哈哈 .例⼦⽤法 : gcc -o hello.exe hello.c (哦,windows⽤习惯了) gcc -o hello.asm -S hello.c-pipe 使⽤管道代替编译中临时⽂件,在使⽤⾮gnu汇编⼯具的时候,可能有些问题. 例⼦⽤法 :gcc -pipe -o hello.exe hello.c-ansi 关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁⽌⼀些asm inline typeof关键字,以及UNIX,vax等预处理宏.)-fno-asm 此选项实现ansi选项的功能的⼀部分,它禁⽌将asm,inline和typeof⽤作关键字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不经意间,GCC已发展到了4.3的版本,尽管在软件开发社区之外乏人闻问,但因为GCC 在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux 、Firefox 乃至于和Apache等几千个项目的开发。
因此,把GCC摆在开源软件的核心地位是一点也不为过。
另一方面,GCC4.3的出现,正在牵引着广大程序员们的心。
如果我们非要用一个词来说明GCC与程序员之间的关系,那无疑是"心随心动"。
历史篇作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是GNU C Compiler 而已。
经过了这么多年的发展,GCC 已经不仅仅能支持C 语言;它现在还支持Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury 语言,等等。
而GCC 也不再单只是GNU C 语言编译器的意思了,而是变成了GNU Compiler Collection 也即是GNU 编译器家族的意思了。
另一方面,说到GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。
几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台。
Gcc 简介Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。
Gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
官方网站:/gcc是linux的唯一编译器,没有gcc就没有linux,gcc的重要性就不可言喻啦。
居然这么重要,那就很值得我们来好好研究下啦。
好啦,开始我们的gcc之旅吧!首先消除gcc和g++误区吧。
gcc和g++都是GNU(组织)的一个编译器。
误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:#include <stdio.h>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 <iostream>#include "me.h"using namespace std;void CppPrintf(void){cout << "Hello\n";}test.cpp:#include <stdlib.h>#include <stdio.h>#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的。
二:今天,我们继续gcc之旅吧。
上节我们讲了些gcc的历史发展什么的,还有就是gcc与g++的区别。
今天我们就从整体上对gcc编译过程有个细致的了解,也好明白他的工作原理,好为以后深入学习研究打下个基础。
gcc的编译流程分为四个步骤,分别为:·预处理(Pre-Processing)·编译(Compiling)->hello.i·汇编(Assembling)->hello.s·链接(Linking)以hello.c为例子,在这四个步骤中可以设置选项分别生成hello.i, hello.s, hello.o以及最终的hello文件:hello.c : 最初的源代码文件;hello.i : 经过编译预处理的源代码;hello.s : 汇编处理后的汇编代码;hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。
hello / a.out : 最终的可执行文件(还有.a(静态库文件), .so(动态库文件), .s(汇编源文件)留待以后讨论)下面就具体来查看一下gcc是如何完成四个步骤的。
hello.c源代码#include<stdio.h>int main(){printf("Hello World!\n");return 0;}(1)预处理阶段在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用gcc的选项”-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程。
《深入理解计算机系统》中是这么说的:预处理器(cpp)根据以字符#开头的命令(directives),修改原始的C程序。
如hello.c中#include <stdio.h>指令告诉预处理器读系统头文件stdio.h的内容,并把它直接插入到程序文本中去。
结果就得到另外一个C程序,通常是以.i作为文件扩展名的。
注意:Gcc指令的一般格式为:Gcc [选项] 要编译的文件[选项] [目标文件]其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out[gan@localhost gcc]# gcc –E hello.c –o hello.i选项”-o”是指目标文件,”.i”文件为已经过预处理的C原始程序。
以下列出了hello.i文件的部分内容:typedef int (*__gconv_trans_fct) (struct __gconv_step *,struct __gconv_step_data *, void *,__const unsigned char *,__const unsigned char **,__const unsigned char *, unsigned char **,size_t *);…# 2 "hello.c" 2int main(){printf("Hello World!\n");return 0;}由此可见,gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。
(2)编译阶段接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。
用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
汇编语言是非常有用的,它为不同高级语言不同编译器提供了通用的语言。
如:C编译器和Fortran 编译器产生的输出文件用的都是一样的汇编语言。
[gan@localhost gcc]# gcc –S hello.i –o hello.s以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。
.file "hello.c".section .rodata.align 4.LC0:.string "Hello World!".text.globl main.type main, @functionmain:pushl %ebpmovl %esp, %ebpsubl $8, %espandl $-16, %espmovl $0, %eaxaddl $15, %eaxaddl $15, %eaxshrl $4, %eaxsall $4, %eaxsubl %eax, %espsubl $12, %esppushl $.LC0call putsaddl $16, %espmovl $0, %eaxleaveret.size main, .-main.ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)".section .note.GNU-stack,"",@progbits(3)汇编阶段汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。