gcc编译器使用说明

要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。

首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。

然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。

我们也简要介绍了调试器的使用方法。

GCC rules你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。

Ken Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。

请到这里阅读他对这个杰作的描述。

幸运的是,我们有了gcc。

当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。

如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。

我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。

我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。

步骤(以及所用工具)如下:预编译 (gcc -E),编译 (gcc),汇编 (as),和连接 (ld)。

开始...首先,我们应该知道如何调用编译器。

实际上,这很简单。

我们将从那个著名的第一个C程序开始。

(各位老前辈,请原谅我)。

#include <stdio.h>int main(){printf("Hello World!\n");}把这个文件保存为 game.c。

你可以在命令行下编译它:gcc game.c在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。

你可以键入如下命令运行它:a.outHello World每一次编译程序时,新的 a.out 将覆盖原来的程序。

你无法知道是哪个程序创建了 a.out。

我们可以通过使用 -o 编译选项,告诉 gcc我们想把可执行文件叫什么名字。

我们将把这个程序叫做 game,我们可以使用任何名字,因为C没有Java那样的命名限制。

gcc -o game game.cgameHello World到现在为止,我们离一个有用的程序还差得很远。

如果你觉得沮丧,你可以想一想我们已经编译并运行了一个程序。

因为我们将一点一点为这个程序添加功能,所以我们必须保证让它能够运行。

似乎每个刚开始学编程的程序员都想一下子编一个1000行的程序,然后一次修改所有的错误。

没有人,我是说没有人,能做到这个。

你应该先编一个可以运行的小程序,修改它,然后再次让它运行。

这可以限制你一次修改的错误数量。

另外,你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。

这可以防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是不能运行。

请切记,能够通过编译的程序并不意味着它是正确的。

下一步为我们的游戏编写一个头文件。

头文件把数据类型和函数声明集中到了一处。

这可以保证数据结构定义的一致性,以便程序的每一部分都能以同样的方式看待一切事情。

#ifndef DECK_H#define DECK_H#define DECKSIZE 52typedef struct deck_t{int card[DECKSIZE];/* 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如果没有错误,就没有问题。

如果编译不能通过,那么就修改它直到能通过为止。

预编译编译器是怎么知道 deck_t 类型是什么的呢?因为在预编译期间,它实际上把"deck.h"文件复制到了"game.c"文件中。

源代码中的预编译指示以"#"为前缀。

你可以通过在gcc后加上 -E 选项来调用预编译器。

gcc -E -o game_precompile.txt game.cwc -l game_precompile.txt3199 game_precompile.txt几乎有3200行的输出!其中大多数来自 stdio.h 包含文件,但是如果你查看这个文件的话,我们的声明也在那里。

如果你不用 -o 选项指定输出文件名的话,它就输出到控制台。

预编译过程通过完成三个主要任务给了代码很大的灵活性。

把"include"的文件拷贝到要编译的源文件中。

用实际值替代"define"的文本。

在调用宏的地方进行宏替换。

这就使你能够在整个源文件中使用符号常量(即用DECKSIZE表示一付牌中的纸牌数量),而符号常量是在一个地方定义的,如果它的值发生了变化,所有使用符号常量的地方都能自动更新。

在实践中,你几乎不需要单独使用 -E 选项,而是让它把输出传送给编译器。

编译作为一个中间步骤,gcc把你的代码翻译成汇编语言。

它一定要这样做,它必须通过分析你的代码搞清楚你究竟想要做什么。

如果你犯了语法错误,它就会告诉你,这样编译就失败了。

人们有时会把这一步误解为整个过程。

但是,实际上还有许多工作要gcc去做呢。

汇编as 把汇编语言代码转换为目标代码。

事实上目标代码并不能在CPU上运行,但它离完成已经很近了。

编译器选项 -c 把 .c 文件转换为以 .o 为扩展名的目标文件。

如果我们运行gcc -c game.c我们就自动创建了一个名为game.o的文件。

这里我们碰到了一个重要的问题。

我们可以用任意一个 .c 文件创建一个目标文件。

正如我们在下面所看到的,在连接步骤中我们可以把这些目标文件组合成可执行文件。

让我们继续介绍我们的例子。

因为我们正在编写一个纸牌游戏,我们已经把一付牌定义为 deck_t,我们将编写一个洗牌函数。

这个函数接受一个指向deck类型的指针,并把一付随机的牌装入deck类型。

它使用'drawn' 数组跟踪记录那些牌已经用过了。

这个具有DECKSIZE个元素的数组可以防止我们重复使用一张牌。

#include <stdlib.h>#include <stdio.h>#include <time.h>#include "deck.h"static time_t seed = 0;void shuffle(deck_t *pdeck){/* Keeps track of what numbers have been used */int drawn[DECKSIZE] = {0};int i;/* One time initialization of rand */if(0 == seed){seed = time(NULL);srand(seed);}for(i = 0; i < DECKSIZE; i++){int value = -1;do{value = rand() % DECKSIZE;}while(drawn[value] != 0);/* mark value as used */drawn[value] = 1;/* debug statement */printf("%i\n", value);pdeck->card[i] = value;}pdeck->dealt = 0;return;}把这个文件保存为 shuffle.c。

我们在这个代码中加入了一条调试语句,以便运行时,能输出所产生的牌号。

这并没有为我们的程序添加功能,但是现在到了关键时刻,我们看看究竟发生了什么。

因为我们的游戏还在初级阶段,我们没有别的办法确定我们的函数是否实现了我们要求的功能。

使用那条printf语句,我们就能准确地知道现在究竟发生了什么,以便在开始下一阶段之前我们知道牌已经洗好了。

在我们对它的工作感到满意之后,我们可以把那一行语句从代码中删掉。

这种调试程序的技术看起来很粗糙,但它使用最少的语句完成了调试任务。

以后我们再介绍更复杂的调试器。

请注意两个问题。

我们用传址方式传递参数,你可以从'&'(取地址)操作符看出来。

这把变量的机器地址传递给了函数,因此函数自己就能改变变量的值。

也可以使用全局变量编写程序,但是应该尽量少使用全局变量。

指针是C的一个重要组成部分,你应该充分地理解它。

我们在一个新的 .c 文件中使用函数调用。

操作系统总是寻找名为'main'的函数,并从那里开始执行。

shuffle.c 中没有'main'函数,因此不能编译为独立的可执行文件。

我们必须把它与另一个具有'main'函数并调用'shuffle'的程序组合起来。

运行命令gcc -c shuffle.c并确定它创建了一个名为 shuffle.o 的新文件。

编辑game.c文件,在第7行,在 deck_t 类型的变量 deck 声明之后,加上下面这一行:shuffle(&deck);现在,如果我们还象以前一样创建可执行文件,我们就会得到一个错误gcc -o game game.c/tmp/ccmiHnJX.o: In function `main':/tmp/ccmiHnJX.o(.text+0xf): undefined reference to `shuffle'collect2: ld returned 1 exit status编译成功了,因为我们的语法是正确的。

但是连接步骤却失败了,因为我们没有告诉编译器'shuffle'函数在哪里。

那么,到底什么是连接?我们怎样告诉编译器到哪里寻找这个函数呢?连接连接器ld,使用下面的命令,接受前面由 as 创建的目标文件并把它转换为可执行文件gcc -o game game.o shuffle.o这将把两个目标文件组合起来并创建可执行文件 game。

连接器从shuffle.o目标文件中找到 shuffle 函数,并把它包括进可执行文件。

目标文件的真正好处在于,如果我们想再次使用那个函数,我们所要做的就是包含"deck.h" 文件并把shuffle.o 目标文件连接到新的可执行文件中。

合集下载

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使用大全

gcc使用大全

1、用于linux系统下编程的编译器概述GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU 开发的编程语言编译器。

它是一套GNU编译器套装以GPL 及LGPL 许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。

GCC 原名为GNU C 语言编译器,因为它原本只能处理C语言。

GCC 很快地扩展,变得可处理C++。

之后也变得可处理Fortran、Pascal、Objective-C、Jav a, 以及Ada与其他语言。

历史GCC是由理查德·马修·斯托曼在1985年开始的。

他首先扩增一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。

Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。

为了让自由软件有一个编译器,后来此编译器由斯托曼和Len Tower在1987年以C语言重写并成为GNU 专案的编译器。

GCC的建立者由自由软件基金会直接管理。

在1997年,一群不满GCC缓慢且封闭的创作环境者,组织了一个名为EGCS 〈Experimental/Enhanced GNU Compiler System〉的专案,此专案汇整了数项实验性的分支进入某个GCC专案的分支中。

EGCS比起GCC的建构环境更有活力,且EGCS最终也在1999年四月成为GCC的官方版本。

GCC目前由世界各地不同的数个程序设计师小组维护。

它是移植到中央处理器架构以及操作系统最多的编译器。

由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP 与BeOS。

GCC通常是跨平台软件的编译器首选。

有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。

《gcc编译器学习》word版

《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的使用方法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将其编译成可执行文件。

gcc的使用简介与命令行参数说明

gcc的使用简介与命令行参数说明

gcc的使⽤简介与命令⾏参数说明(⼀) gcc的基本⽤法(⼆) 警告提⽰功能选项(三) 库操作选项(四) 调试选项(五) 交叉编译选项(⼀) gcc的基本⽤法使⽤gcc编译器时,必须给出⼀系列必要的调⽤参数和⽂件名称。

不同参数的先后顺序对执⾏结果没有影响,只有在使⽤同类参数时的先后顺序才需要考虑。

如果使⽤了多个 -L 的参数来定义库⽬录,gcc会根据多个 -L 参数的先后顺序来执⾏相应的库⽬录。

因为很多gcc参数都由多个字母组成,所以gcc参数不⽀持单字母的组合,Linux中常被叫短参数(short options),如 -dr 与 -d -r 的含义不⼀样。

gcc编译器的调⽤参数⼤约有100多个,其中多数参数我们可能根本就⽤不到,这⾥只介绍其中最基本、最常⽤的参数。

gcc最基本的⽤法是:gcc [options] [filenames]其中,options就是编译器所需要的参数,filenames给出相关的⽂件名称,最常⽤的有以下参数:-c只编译,不链接成为可执⾏⽂件。

编译器只是由输⼊的 .c 等源代码⽂件⽣成 .o 为后缀的⽬标⽂件,通常⽤于编译不包含主程序的⼦程序⽂件。

-o output_filename确定输出⽂件的名称为output_filename。

同时这个名称不能和源⽂件同名。

如果不给出这个选项,gcc就给出默认的可执⾏⽂件 a.out 。

-g产⽣符号调试⼯具(GNU的 gdb)所必要的符号信息。

想要对源代码进⾏调试,就必须加⼊这个选项。

-O对程序进⾏优化编译、链接。

采⽤这个选项,整个源代码会在编译、链接过程中进⾏优化处理,这样产⽣的可执⾏⽂件的执⾏效率可以提⾼,但是编译、链接的速度就相应地要慢⼀些,⽽且对执⾏⽂件的调试会产⽣⼀定的影响,造成⼀些执⾏效果与对应源⽂件代码不⼀致等⼀些令⼈“困惑”的情况。

因此,⼀般在编译输出软件发⾏版时使⽤此选项。

-O2⽐ -O 更好的优化编译、链接。

Linux编程 使用gcc编译C程序

Linux编程  使用gcc编译C程序
}
}
编译时可以使用如下命令:
gcc -o func main.c fun.c
编译完成后,使用下面的命令执行并显示结果:
./func 5
5的阶乘是:120
2.gcc的错误类型及对策
gcc编译器如果发现源程序中有错误,就无法继续进行,也无法生成最终的可执行文件。为了便于修改,gcc给出错误资讯,用户必须对这些错误资讯逐个进行分析、处理,并修改相应的语言,才能保证源代码的正确编译连接。gcc给出的错误资讯一般可以分为四大类,这里分别来讨论其产生的原因和对策。
排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。这个过程中的错误,只是在使用C语言描述一个算法中所产生的错误,是比较容易排除的。一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,还需要更加深入地测试、调试和修改。稍为复杂的程序,往往要经过多次的编译、连接和测试、修改,用户在学习中应该不断提高程序的维护和调试能力。
#include <stdio.h>
int main()
{
printf("你好!");
return 0;
}
接下开打开终端窗口,进入到该文件所在目录,并输入下面的命令:
gcc -o mytest test.c
上述命令执行完毕后,会在该源文件所在目录下生成一个新文件,该文件名称为mytest,该文件就是编译过的可执行文件,在终端容器中再次输入以下命令:
int i=1;
for(i;i<=100;n++)
sum=sum+i;
printf("最后结果为:%d",sum);

gcc命令的参数

gcc命令的参数一、介绍GCC(GNU Compiler Collection)是一套广泛使用的编译器工具集,用于编译C、C++、Objective-C、Fortran等多种程序语言。

GCC命令的参数是指在使用GCC编译器时可以添加的选项和参数,通过这些参数可以对编译过程进行控制和定制,以满足不同的需求。

本文将详细介绍GCC命令的参数及其使用方法。

二、常用参数1. -o <file>指定输出文件的名称。

例如,gcc main.c -o main将编译main.c文件并输出可执行文件main。

2. -c只进行编译,不进行链接。

使用该参数可以将源代码编译为目标文件(.o文件),而不生成可执行文件。

3. -E只进行预处理,生成预处理后的代码。

该参数可用于查看预处理后的代码,以便调试和分析。

4. -g生成调试信息。

使用该参数可以在编译过程中生成调试信息,以便在调试程序时进行源代码级别的调试。

5. -Wall打开所有警告信息。

使用该参数可以让编译器输出所有可能的警告信息,帮助开发者发现潜在的问题。

6. -O优化选项。

GCC提供了多个优化选项,例如-O1、-O2、-O3等,可以根据需求选择不同级别的优化。

7. -I <dir>添加头文件搜索路径。

使用该参数可以告诉编译器在指定的目录中搜索头文件。

添加库文件搜索路径。

使用该参数可以告诉编译器在指定的目录中搜索库文件。

9. -l <library>链接指定的库文件。

使用该参数可以告诉编译器链接指定的库文件,例如-lm表示链接数学库。

10. -D <macro>定义宏。

使用该参数可以在编译过程中定义宏,以控制源代码中的条件编译。

三、高级参数1. -Werror将警告视为错误。

使用该参数可以将编译过程中的警告信息视为错误,编译过程将被中断。

2. -std=<standard>指定所使用的语言标准。

GCC支持多个语言标准,例如-std=c11表示使用C11标准。

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是生成的可执行文件名。

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

arm-linux-gcc常用参数讲解gcc编译器使用方法我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。

下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。

在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段:1. 预处理(Pre-Processing)2. 编译(Compiling)3. 汇编(Assembling)4. 链接(Linking)Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。

和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。

以文件example.c为例说明它的用法0. arm-linux-gcc -o example example.c不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。

-o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out1. arm-linux-gcc -c -o example.oexample.c-c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以2.arm-linux-gcc -S -o example.sexample.c-S参数将对源程序example.c进行预处理、编译,生成example.s文件-o选项同上3.arm-linux-gcc -E -o example.iexample.c-E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上)就是将#include,#define等进行文件插入及宏扩展等操作。

gcc编译的详细步骤

gcc编译的详细步骤⼀:GCC⼀般编译建⽴hello.c# vi hello.c#include <stdlib.h>#include <stdio.h>void main(void){printf("hello world!\r\n");}⽤gcc编译成执⾏程序。

#gcc -o hello hello.c该命令将hello.c直接⽣成最终⼆进制可执⾏程序a.out这条命令隐含执⾏了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的⼆进制可执⾏程序。

这⾥未指定输出⽂件,默认输出为a.out。

如何要指定最终⼆进制可执⾏程序名,那么⽤-o选项来指定名称。

⽐如需要⽣成执⾏程序hello.exe那么#gcc hello.c -o hello.exe⼆:GCC编译详细步骤,分为四步:从上⾯我们知道GCC编译源代码⽣成最终可执⾏的⼆进制程序,GCC后台隐含执⾏了四个阶段步骤。

GCC编译C源码有四个步骤:预处理-----> 编译 ----> 汇编 ----> 链接现在我们就⽤GCC的命令选项来逐个剖析GCC过程。

1)预处理(Pre-processing)在该阶段,编译器将C源代码中的包含的头⽂件如stdio.h编译进来,⽤户可以使⽤gcc的选项”-E”进⾏查看。

⽤法:#gcc -E hello.c -o hello.i作⽤:将hello.c预处理输出hello.i⽂件。

[root]# gcc -E hello.c -o hello.i[root]# lshello.c hello.i[root]# vi hello.i# 1 "hello.c"# 1 "<built-in>"# 1 "<command line>"# 1 "hello.c"# 1 "/usr/include/stdlib.h" 1 3# 25 "/usr/include/stdlib.h" 3# 1 "/usr/include/features.h" 1 3# 291 "/usr/include/features.h" 3# 1 "/usr/include/sys/cdefs.h" 1 3# 292 "/usr/include/features.h" 2 3# 314 "/usr/include/features.h" 3# 1 "/usr/include/gnu/stubs.h" 1 3# 315 "/usr/include/features.h" 2 3# 26 "/usr/include/stdlib.h" 2 3# 3 "hello.c" 2void main(void){printf("hello world!\r\n");}2)编译阶段(Compiling)第⼆步进⾏的是编译阶段,在这个阶段中,Gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,Gcc把代码翻译成汇编语⾔。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档