澳门新葡亰官网app 7

GCC程序编译,GCC编写翻译器使用澳门新葡亰官网app

By admin in 澳门新葡亰官网app on 2019年9月3日

GCC编译器使用,gcc编译器

正文之前

1.1实验目的

一、GCC简介

通常所说的GCC是GUN Compiler
Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序,它是Linux平台编译器的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用,是因为它能支持各种不同的目标体系结构。例如,它既支持基于宿主的开发(简单讲就是要为某平台编译程序,就在该平台上编译),也支持交叉编译(即在A平台上编译的程序是供平台B使用的)。目前,GCC支持的体系结构有四十余种,常见的有X86系列、Arm、PowerPC等。同时,GCC还能运行在不同的操作系统上,如Linux、Solaris、Windows等。

除了上面讲的之外,GCC除了支持C语言,还支持多种其他语言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal、go等。

GCC的安装:

Ubuntu等基于Debian发行版Linux可以使用如下命令安装:

apt -get install gcc

Fedora等基于RPM发行版Linux可以使用如下命令安装:

yum install gcc

使用如下命令查看gcc的版本:

gcc --version

本文地址:,转载请注明源地址。

因为在暑假的时候上一门课,差不多是要在20天学会C/C++的大部分内容,这个样子,所以打算在这里记录一些学习的笔记,给之后的自己看看,也可以作为分享。

n熟练掌握Linux GCC的使用操作方法

二、程序的编译过程

对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所示:

澳门新葡亰官网app 1

从功能上分,预处理、编译、汇编是三个不同的阶段,但GCC的实际操作上,它可以把这三个步骤合并为一个步骤来执行。下面以C语言为例来谈一下不同阶段的输入和输出情况。

GCC编译器的基本选项如下表:

类型 说明
-E 预处理后即停止,不进行编译、汇编及连接
-S 编译后即停止,不进行汇编及连接
-c 编译或汇编源文件,但不进行连接
-o file 指定输出文件file

在预处理阶段,输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、
#include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件不可,可以利用下面的示例命令:

gcc -E  test.c -o test.i

在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s
。这个阶段对应的GCC命令如下所示:

gcc -S test.i -o test.s

在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:

gcc -c test.s -o test.o

最后,在连接阶段将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:

gcc test.o -o test

运行如下:

澳门新葡亰官网app 2

可以通过:cat -n [filename]命令查看每一个阶段的文件内容

上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。

首先在编一些C、C++的代码的时候需要了解一下什么是GCC,GNU Compiler Collection的简称,顾名思义是一个编译器的集合。

1.2实验内容

三、警告选项

GCC提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告

GCC的编译器警告选项如下表:

类型 说明
-Wall 启用所有警告信息
-Werror 在发生警告时取消编译操作,即将警告看作是错误
-w 禁用所有警告信息

实例1:给出一段代码,使用gcc进行编译,同时开启警告信息(test1.c)

#include<stdio.h>
int main()
{
   int i;
   for(i = 0; i <= 3; i++)
     printf("hello gcc!\n");
   //return 0;
}

使用-Wall开启警告:

澳门新葡亰官网app 3

从上面可以看出,GCC给出了警告信息,意思是main函数的返回值被声明为int,但是没有返回值,GCC并不是简单的发出警告,会中断整个编译过程

如果不想看到警告信息,可以使用-w来禁止所有的警告。

此外,GCC还提供了许多以-W开头的选项,允许用户指定输出某个特定的警告,例如:

  • -Wcomment:出现注释嵌套时发出警告。

  • -Wconversion:如果程序中存在隐式类型转换,则发出警告。

  • -Wformat:检查printf和scanf等格式化输入输出函数的格式字符串和参数类型的匹配情况,如果发现不匹配则发出警告。

  • -Winline:如果函数不能被内联,则发出警告。

  • -Wlong-long:如果使用了long long型数据,则发出警告。

  • -Wmain:如果main函数的返回类型不是int型,或者调用main函数时使用的参数数目不正确,则发出警告。

  • -Wmissing-declarations:如果定义了全局函数,但却没有在头文件中声明,则发出警告。

  • -Wparentheses:在某些情况下,如果忽略掉了括号,则会发出警告。

  • -Wreturn-type:如果函数定义了返回类型,而默认类型是int型,编译器会发出警告。

  • -Wuninitialized:如果使用的自动变量没有被初始化,则发出警告。

  • -Wundef:如果在#if宏中使用了未定义的变量做判断,则发出警告。

  • -Wunused:如果声明的变量或static型函数没有使用,则发出警告。

实例2:给出一段代码,使用gcc进行编译,同时开启警告信息(test2.c)

#include<stdio.h>
int main( )
{
    int a = 1;
    int b = 0;
    int c = 1;
    if(a && b || c)
    {
        ;
    }
    if(a == 1)
        if(b == 1)
            printf("b = 1\n");
    else
        printf("b != 1\n");
    return 0;
}

使用-Wparentheses开启警告:

澳门新葡亰官网app 4

GCC的知识

n综合运用Linux GCC的技巧操作。

四、优化选项

GCC具有优化代码的功能,主要的优化选项包括如下:

  • -O0:不进行优化处理。
  • -O或-O1:进行基本的优化,这些优化在大多数情况下都会使程序执行得更快。
  • -O2:除了完成-O1级别的优化外,还要一些额外的调整工作,如处理器指令调度等,这是GNU发布软件的默认优化级别。√
  • -O3:除了完成-O2级别的优化外,还进行循环的展开以及其他一些与处理器特性相关的优化工作。
  • -Os:生成最小的可执行文件,主要用于在嵌入式领域。

一般来说,优化级别越高,生成可执行文件的运行速度也越快,但消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,到软件发行或开发结束的时候才考虑对最终生成的代码进行优化。

  • -finline-functions:允许编译器将一些简单的函数在其调用处展开。
  • -funswitch-loops:将循环体中值不改变的变量移到循环体外。

实例:给出一段代码,使用gcc进行编译,同时比较优化前后执行程序所花的时间(test3.c)

#include<stdio.h>
int main()
{
   int i, j, x;
   x = 0;
   for(i = 0; i < 100000; i++) {
       for(j = i; j > 0; j--) {
           x += j;
       }
   }
   return 0;
}

运行后的结果如下:

澳门新葡亰官网app 5

可以看到,优化的效果十分的显著

 

以下是来源于百度知道电脑网络分类达人 郭强的回答,觉得解释的很好,还可以作为收藏。

1.3步骤及现象

gcc编译器的使用

dir??
在WINDOWS下面用的?

gcc是一个编译器,不是编辑器,而不是调试工具…

初始的话,直接gcc X.c吧.
调试使用gdb.

//X.c
gcc -g -otest.exe X.c
//-o是编译后的可执行文件名,-g是加入调试信息,这样就可以使用gdb调试了.
gdb test.exe
<gdb> r
//之后就是使用gdb的命令了,r运行,b设断点,l(list)是列出源码,q退出,w查看某个变量

上面的勉强足够用于新学的吧.
 

什么是GCC?GCC是由GNU之父Stallman所开发的linux下的编译器,全称为GNU
Compiler Collection, 目前可以编译的语言包括:C, C++, Objective-C,
Fortran, Java, and Ada,
可以在其官方页面找到更加详细的信息什么是GCC?GCC是一个原本用于Unix-like系统下编程的编译器。不过,现在GCC也有了许多Win32下的移植版本。这要感谢Internet上众多程序员的共同努力。

GCC是GNU公社的一个项目。是一个用于编程开发的自由编译器。最初,GCC只是一个C语言编译器,他是GNU
C Compiler
的英文缩写。随着众多自由开发者的加入和GCC自身的发展,如今的GCC以经是一个包含众多语言的编译器了。其中包括
C,C++,Ada,Object C和Java等。所以,GCC也由原来的GNU C Compiler变为GNU
Compiler Collection。也就是 GNU编译器家族
的意思。当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。

直到现在,GCC的历史仍然在继续,他的传奇仍然被人所传颂。GCC有什么作用?Linux系统下的Gcc(GNU
C
Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。GCC有什么作用?Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。

.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。

虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。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更好的优化编译、连接,当然整个编译、连接过程会更慢。
-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
A)#include
B)#include “myinc.h”
其中,A类使用尖括号(< >),B类使用双引号(“
”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件

n利用GCC编译器编译程序

什是GCC编译器?

Linux系统下的Gcc(GNU C
Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
Gcc的执行过程
虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

Gcc的基本用法和选项
在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。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更好的优化编译、连接,当然整个编译……余下全文>>
 

一、GCC简介
通常所说的GCC是GUN Compiler Collection的简称,
除了编译程序之外,它还含其他相关工具 ,所以它能把易…

其他的一些安装方法

1、实验要求:

  1. 通过port安装;
  2. Github安装。参考:https://github.com/kennethreitz/osx-gcc-installer;
  3. 通过手工方式安装,也是通过用终端实现的;
  4. 通过homebrew安装;

以上参考来源:赵磊的技术博客:http://elf8848.iteye.com/blog/1973736

编写一个应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项,了解这些选项的作用。

使用homebrew安装gcc
该方法只适用于Mac
OS,windows用户可以用Cygwin配置好一个类似Linux的环境来实现;

2、实验器材:

第一步。已经在电脑上装好了homebrew,具体直接在homebrew的官网上查看,记得是一条代码在终端里就可以实现安装homebrew。

软件:

第二步。一条代码就安装好了。 brew install gcc

安装了ubuntu的VMware虚拟机。

澳门新葡亰官网app 6

硬件:

2.png

PC机一台。

好的,我们安装好了,可以通过在终端用 gcc -v 查看我们安装的版本。

3、背景知识:

澳门新葡亰官网app 7

ügcc的概念:

3.png

GCC(GNU CompilerCollecti
on,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑MacOSX操作系统的标准编译器。GCC原名为GNU
C语言编译器,因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理For
tr an、Pascal、Obj ecti v e-C、Jav
a,以及Ada与其他语言。我们使用的gcc命令主要是用于处理c语言程序。

感觉需要写一个简单的hello_world的.c文件作为一个练手用来看看怎么在终端上编译并运行我们写的程序。

ügcc的执行过程:

虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(
Compilation)、汇编( Assembly)和链接( Linki
ng)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(
i

ncl
ude)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的库中连到合适的地方。以上这些过程是gcc内部实现的机制,实际使用中,上述过程可以又通过gcc的选项实现,具体方法请通过实验体会。

4、实验步骤

ü先用vim编辑hello.c文件,内容如图所示:

图1vim编写hello.c

ügcc命令的一般格式为:gcc[选项]要编译的文件[选项][目标文件]。

下面使用命令gcchello.c–ohello,编译hello.c,并生成可执行文件hello,

图2直接生成可执行文件hello

注意:上面的命令将.c文件生成了可执行文件,实际上是将预处理、编译、汇编、连接一步完成,下面我们将介绍四个流程分别做了什么工作。

ü使用–E选项,执行预处理工作。使用命令gcc–E hello.c–o
hello.i对hello.c进行预处理,生成文件hello.i,如图所示:

图3使用-E选项

使用命令cat

hello.i查看hello.i文件的内容,如图5-4所示,可以看到头文件

stdio.h中包含的内容替换掉了原先代码中的#include。

图4查看文件hello.i内容

ü使用–S选项,执行编译处理工作。使用命令gcc–S hello.i–o
hello.s对hello.i进行编译,生成汇编文件hello.s,如图所示:

图5使用-S选项

使用命令cat

hello.s查看hello.s文件的内容,如图5-6所示,可以看到原来的

澳门新葡亰官网app,c语言代码已被转化为汇编代码。

图6查看文件hello.s内容

ü使用–c选项,执行编译工作。使用命令gcc–chello.s–o

hello.o对hello.s进行汇编,生成目标文件hello.o,如图所示:

图7执行使用-c选项

ü使用命令gcc hello.o–o hello将hello.o链接库,生成可执行文件hello,如图

所示,以上四个步骤就对应了gcc执行过程的四个基本步骤,下面我们来看看gcc其他一些重要的选项。

图8连接生成可执行文件

ü使用–static选项,静态链接库。使用命令gcchello.c–ohello和gcchello.c–static–ohello1分别生成两个可执行文件hello和hello1。头一个文件hello是不加-static选项,默认是链接动态库生成的,如图所示,试比较链接动态库生成的文件hello和链接静态库生成的文件hello1的大小。

图9使用-static选项

可以看到静态链接库的可执行文件hello1要比动态链接库的文件hello大很多,他们的执行效果是一样的。

注意:要使动态链接库的可执行文件能够在机器上运行,必须保证系统中安装有相关的动态链接库,这些库一般在/lib目录下。

ü使用–g选项,在可执行程序中包含标准调试信息。使用命令gcc–ghello.c–o

hello2生成包含调试信息的文件hello2,如图所示,带有调试信息的可执行文件可以使用gdb调试器进行调试,gdb的具体用法将在下节讨论。

图10使用-g选项

ü使用–D选项,在编译时进行宏定义。使用命令gcc–DLINUXhello.c–o

hello3生成定义了宏LINUX的的可执行文件hello3,如图所示,将hello3和原可执行文件hello进行比较。

图11修改源码,注释第三行代码

图12使用-D选项

ü使用–O2选项,完成程序的优化工作。为了能够看出优化效果,首先在源代码中添加如图所示内容

图13优化测试代码

使用命令rm

hello? hello–f,删除之前生成的文件,使用命令gcc–O2 hello.c–o
hello1生成优化后的可执行文件hello1,使用命令gcc hello.c–o

hello生成未经优化的可执行文件hello。如图5-13所示,将hello1和未优化过的可执行文件hello进行比较。

图14使用-O2选项

提示:事实上gcc有四个优化等级,分别对应选项-O0、-O1、-O2和-O3,其中-O0代表不优化,这个是缺省值,-O1到-O3优化等级逐步提高。另外还有个特殊的优化选项-Os,它通常被称为是优化等级为2.5的优化选项,是在-O2的基础上对代码尺寸进行了进一步优化。另外,为了更好的验证优化的效果,可以使用time命令,如time./hello,可以测试当前目录下可执行文件hello的执行时间。由于实验代码过于简单,所以用time测试基本看不出差别,大家可以自己编写复杂耗时的程序用于这个实验。注意:虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。

因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场噩梦。所以笔者建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有