Gcc特点

Gcc基本用法

1、gcc的概念

GCC(GNU Compiler Collection,GNU编译器套装),是一款由GNU开发的编程语言编译器。GCC原名为GNU C 语言编译器,因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、java,以及Ada与其他语言。

2、GCC的执行过程

使用GCC,把C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤:预处理(也称为预编译,Preprocessing)、编译(compilation)、汇编(assembly)、和链接(linking)。

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

gcc命令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件] eg:gcc hello.c -o hello;本过程实际上将预处理、编译、汇编、链接一步完成。下面分别介绍每个流程

执行预处理工作:gcc -E hello.c -o hello.i  生成hello.i

执行编译处理工作:gcc -S hello.i -o hello.s生成汇编文件hello.s

执行编译工作:gcc -c hello.s -o hello.o  对hello.s进行汇编,生成目标文件hello.o

执行链接工作:gcc hello.o -o hello

编译选项

使用-g选项,在可执行程序中包含标准调试信息。使用命令gcc -g hello.c -o hello2生成包含调试信息的文件hello2,带有调试信息的可执行文件可以使用gdb调试器进行调试。

使用-D选项,在编译时进行宏定义。使用命令gcc -DLINUX hello.c -o hello3生成了宏LINUX的可执行文件hello3。

使用-O2选项,完成程序的优化工作。

time ./hello 测试hello可执行文件的执行时间。

-Wall:生成所有的警告信息

-w:不生成任何警告信息

-DMACRO:使用-D定义MACRO宏,等效于在程序中使用#define MACRO

每一个编译器都有标准的寻找头文件的路径!!!!gcc会在/usr/include/下面去找

-I dirname:将dirname所指出的目录作为编译器寻找头文件的标准路径。对于<>,gcc在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;而对于"",gcc在当前目录中搜寻头文件。-I作用是告诉gcc,如果在当前目录未找到需要的头文件,就到指定的dirname目录中去寻找:eg:gcc foo.c -I /home/include -o foo

-static 将产生一个和static库一道链接的可执行文件。当没有开启-static选项时,链接器首先试着用共享库,假如共享版本不可用,然后再试着用静态库。

-shared 告诉gcc产生一个共享库,该共享库能在链接时和其他的共享文件一起形成可执行文件,该共享库也能在运行时装载进可执行文件的地址空间,使用-shared是创建一个共享ELF库的首选方法。

part1:13-linux编译器GCC的更多相关文章

  1. Linux 之 编译器 gcc/g++参数详解

    2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++ ...

  2. 【Linux开发】如何在./configure的时候将编译参数传入,改变默认的编译器gcc成arm-linux-gcc

    如何在configure时,将编译参数传入,改变默认的编译器gcc成arm-linux-gcc [问题] 想要用交叉编译工具arm-linux-gcc去编译lrzsz, 但是在./configure的 ...

  3. MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

    本文主要讲述如何安装 C语言 编译器——MinGW-w64,特点是文章附有完整详细的实际安装过程截图,文字反而起说明提示作用. 编写本文的原因始于我的一个观点:图片可以比文字传达更多的信息,也能让其他 ...

  4. MinGW安装教程——著名C/C++编译器GCC的Windows版本

    前言本文主要讲述如何安装 C语言 编译器——MinGW,特点是文章附有完整详细的实际安装过程截图,文字反而起说明提示作用. 编写本文的原因始于我的一个观点:图片可以比文字传达更多的信息,也能让其他人更 ...

  5. 《⑨也懂系列:MinGW-w64安装教程》著名C/C++编译器GCC的Windows版本(MinGW-w64在安装的时候可以选择版本,有图,一步一步)

    发布日期 2016年10月31日 分类 教程 标签 编程.软件 前言<⑨也懂系列:MinGW-w64安装教程>这篇文章由 rsreland (http://rsreland.net)于 2 ...

  6. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  7. 详解Linux安装GCC方法

    转载自:http://blog.csdn.net/bulljordan23/article/details/7723495/ 下载: http://ftp.gnu.org/gnu/gcc/gcc-4. ...

  8. linux 安装gcc和g++

    linux中安装gcc和g++ 今天在linux的服务器上安装C/C++的编译器gcc和g++,运行了如下两条命令: 1 yum install gcc yum install g++ 然后发现gcc ...

  9. 在Linux使用GCC编译C语言共享库

    在Linux使用GCC编译C语言共享库 对任何程序员来说库都是必不可少的.所谓的库是指已经编译好的供你使用的代码.它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例 ...

随机推荐

  1. php获取服务器信息类

      <?php/**+------------------------------------------------------------------------------* 获取服务器信 ...

  2. jap_spring

    jar包 applicationContent.xml <?xml version="1.0" encoding="UTF-8"?> <bea ...

  3. UI5-文档-4.21-Data Types

    发票清单已经很好看了,但是没有指定价格的发票是什么?通常价格以技术格式存储,并带有'.数据模型中的分隔符.例如,我们的菠萝发票上的计算价格是87.2,没有货币.我们将使用SAPUI5数据类型正确地格式 ...

  4. winform程序开机启动时的运行目录

    并不是程序的当前路径,而是系统的某个目录 如环境是win10 64位,路径是 c:\winfows\SysWOW64\ConfigInfor.json

  5. Numpy统计

    Numpy统计 axis=None 是统计函数的标配参数,默认不输入此参数则为对数组每一个元素进行计算,设定轴则对此轴上元素进行计算 1:常用统计函数 .sum(a,axis=None):数组a求和运 ...

  6. sudoers的权限被改,又忘记了root密码,又不能重启。这么做。

    报下面这个错 sudo: /etc/sudoers is world writablesudo: no valid sudoers sources found, quittingsudo: unabl ...

  7. dubbo dubbo.xsd 报错

    构建dubbo项目的时候会遇到: Multiple annotations found at this line: - cvc-complex-type.2.4.c: The matching wil ...

  8. Jakarta项目

    Jakarta项目是ASF(The Apache Software Foundation)的一部分.ASF是一个非赢利组织,她鼓励基于开放的软件许可下进行合作.注重实效的开发,并提供各个领域的高质量软 ...

  9. CentOS7.0重置Root的密码 (忘记密码)

    首先进入开启菜单,按下e键进入编辑现有的内核,如下图所示 然后滚动列表,找到ro,将它替换成rw,并加上init=/sysroot/bin/sh,最终变为如下图 然后按CTRL+X进入到单用户模式,在 ...

  10. Spring/AOP框架, 以及使用注解

    1, 使用代理增加日志, 也是基于最原始的办法 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; ...