2022年如何使用gcc编译器 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年如何使用gcc编译器 .pdf》由会员分享,可在线阅读,更多相关《2022年如何使用gcc编译器 .pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、如何使用 gcc 编译器?作者:Zhang Wei 翻译 2004-10-05 20:24:41 来自:linuxfocus目录:GCC rules 开始.预编译编译汇编连接另外两个重要选项调试小结站点链接摘要:要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc 编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。GCC rules 你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什名师资料总结-精品资料欢迎下载-名师
2、精心整理-第 1 页,共 9 页 -么?可能会加入各种后门和木马。Ken Thompson 是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在 login程序中留下后门和永久的木马。请到这里 阅读他对这个杰作的描述。幸运的是,我们有了 gcc。当你进行configure;make;make install 时,gcc 在幕后做了很多繁重的工作。如何才能让 gcc 为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C 程序
3、,以及如何使用编译选项让gcc 按照我们的要求工作。步骤(以及所用工具)如下:预编译(gcc-E),编译(gcc),汇编(as),和 连接(ld)。开始.首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。#include int main()printf(Hello World!n);把这个文件保存为game.c。你可以在命令行下编译它:gcc game.c 在默认情况下,C 编译器将生成一个名为a.out的可执行文件。你可以键入如下命令运行它:a.out Hello World每一次编译程序时,新的a.out将覆盖原来的程序。你
4、无法知道是哪个程序创建了a.out。我们可以通过使用-o编译选项,告诉gcc 我们想把可执行文件叫什么名字。我们将把这个程序叫做game,我们可以使用任何名字,因为C 没有 Java那样的命名限制。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 9 页 -gcc-o game game.c game Hello World到现在为止,我们离一个有用的程序还差得很远。如果你觉得沮丧,你可以想一想我们已经编译并运行了一个程序。因为我们将一点一点为这个程序添加功能,所以我们必须保证让它能够运行。似乎每个刚开始学编程的程序员都想一下子编一个1000 行的程序,然后一次修改所有的错误。没有
5、人,我是说没有人,能做到这个。你应该先编一个可以运行的小程序,修改它,然后再次让它运行。这可以限制你一次修改的错误数量。另外,你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。这可以防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是不能运行。请切记,能够通过编译的程序并不意味着它是正确的。下一步为我们的游戏编写一个头文件。头文件把数据类型和函数声明集中到了一处。这可以保证数据结构定义的一致性,以便程序的每一部分都能以同样的方式看待一切事情。#ifndef DECK_H#define DECK_H#define DECKSIZE 52 typedef
6、 struct deck_t int cardDECKSIZE;/*number of cards used*/int dealt;deck_t;#endif/*DECK_H*/把这个文件保存为deck.h。只能编译.c文件,所以我们必须修改 game.c。在 game.c 的第 2 行,写上#include deck.h。在第 5 行写上deck_t deck;。为了保证我们没有搞错,把它重新编译一次。gcc-o game game.c 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 9 页 -如果没有错误,就没有问题。如果编译不能通过,那么就修改它直到能通过为止。预编译编译器
7、是怎么知道deck_t类型是什么的呢?因为在预编译期间,它实际上把deck.h文件复制到了game.c 文件中。源代码中的预编译指示以#为前缀。你可以通过在gcc 后加上-E选项来调用预编译器。gcc-E-o game_precompile.txt game.c wc-l game_precompile.txt 3199 game_precompile.txt 几乎有 3200 行的输出!其中大多数来自stdio.h包含文件,但是如果你查看这个文件的话,我们的声明也在那里。如果你不用-o选项指定输出文件名的话,它就输出到控制台。预编译过程通过完成三个主要任务给了代码很大的灵活性。1.把incl
8、ude 的文件拷贝到要编译的源文件中。2.用实际值替代 define 的文本。3.在调用宏的地方进行宏替换。这就使你能够在整个源文件中使用符号常量(即用DECKSIZE 表示一付牌中的纸牌数量),而符号常量是在一个地方定义的,如果它的值发生了变化,所有使用符号常量的地方都能自动更新。在实践中,你几乎不需要单独使用-E选项,而是让它把输出传送给编译器。编译作为一个中间步骤,gcc 把你的代码翻译成汇编语言。它一定要这样做,它必须通过分析你的代码搞清楚你究竟想要做什么。如果你犯了语法错误,它就会告诉你,这样编译就失败了。人们有时会把这一步误解为整个过程。但是,实际上还有许多工作要gcc 去做呢。名
9、师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 9 页 -汇编as把汇编语言代码转换为目标代码。事实上目标代码并不能在CPU上运行,但它离完成已经很近了。编译器选项-c把.c 文件转换为以 .o 为扩展名的目标文件。如果我们运行gcc-c game.c 我们就自动创建了一个名为game.o 的文件。这里我们碰到了一个重要的问题。我们可以用任意一个.c 文件创建一个目标文件。正如我们在下面所看到的,在连接步骤中我们可以把这些目标文件组合成可执行文件。让我们继续介绍我们的例子。因为我们正在编写一个纸牌游戏,我们已经把一付牌定义为deck_t,我们将编写一个洗牌函数。这个函数接受一个指向
10、deck类型的指针,并把一付随机的牌装入deck类型。它使用 drawn 数组跟踪记录那些牌已经用过了。这个具有DECKSIZE 个元素的数组可以防止我们重复使用一张牌。#include#include#include#include deck.h static time_t seed=0;void shuffle(deck_t*pdeck)/*Keeps track of what numbers have been used*/int drawnDECKSIZE=0;int i;/*One time initialization of rand*/if(0=seed)seed=time(N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年如何使用gcc编译器 2022 如何 使用 gcc 编译器
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内