-Wall: 使输出中包含警告信息,提示一些可以避免的错误。如果没有错误,则不会输出信息。

-o:后面加上可执行文件的名字。如果不加-o选项,会默认生成a.out可执行文件。举例:gcc -Wall -o circle circle.c。因为加了-o circle,所以会生成circle可执行文件,而不生成a.out.

下面介绍四个过程:预处理,编译,汇编,链接。

1。预处理。

预处理主要是执行预处理指令和扩展宏。gcc一般不产生预处理后的中间输出。可以使用-E来输出预处理得到的结果。

-E:直接使用gcc -E circle.c,产生的结果会在屏幕上输出,输出内容很多。因为它包含了若干头文件的内容。使用gcc -E -o circle.i,产生的结果会重定向到circle.i。file.i表示经过了预处理后的c源文件。加上-C会在预处理的结果中包括注释。gcc -e -C -o circle.i circle.c.

-D name[=definition]: 这个不是很懂,大概是用来条件编译的,需要和#ifdex name一起用。

-U name:也不懂,和上一个有点关系。未定义符号name.

-I directory[:directory[...]]:当在源码中使用#include指令时,会从该目录和系统标准include目录寻找。通常的寻找顺序为:1)该源文件所在目录。2)通过 -I 选项指定的目录。3)环境变量C_INCLUDE_PATH and CPATH指定的目录。4)系统默认include目录。

-I- :这个选项用来分割-I directory,在-I-左边的目录,不适用于带有尖括号的#include指令,比如#inlcude<stdio.h>,就是说在找stdio.h这个文件时,不会在-I-左边的目录中找。-I-左边的目录只适用于带引号的文件,比如#include "myheader.h"。对-I-右边的目录,尖括号和双引号的文件都可以找。当使用 -I - 使,上面的四个寻找步骤中的第一步会忽略。

2。编译。

编译的工作就是把c程序翻译成汇编程序。一般,每个CPU 架构都有自己的汇编语言,所以汇编语言很多。一般情况,gcc把生成的汇编代码存储在临时文件中,但是当汇编开始运行后,会把它给删掉。可以使用-S来查看生成的汇编代码。

-S : -S 会生成以.s结束的 汇编语言文件。gcc -S circle.c, 会生成circle.s文件。

为了在汇编代码中生成包含C 语言变量名的注释,可以使用-fverbose-asm。举例:gcc -S -fverbose-asm circle.c。

3。汇编(或组装)

因为每个机器结构有自己的汇编语言。gcc使用一个汇编器将汇编语言程序转换成可执行二进制文件。结果是对象文件,包含从源文件生成的可执行机器代码和外部链接文件中所有对象对应的符号表。生成的对象文件也是临时的,会在链接时被删除。使用 -c选项来生成对象文件。

-c: 对象文件以.o结尾。gcc -c circle.c.

4。链接

将多个二进制文件链接成一个可执行文件。有三种链接不在gcc搜索范围内的库文件方式。

1) gcc -o circle circle.c /usr/local/lib/libmath.a。库文件链接的方式类似于对象文件。

2)使用-L选项。举例:gcc -o circle -L/usr/local/lib -lmath circle.c. 可以使用多个库目录,这可以用多个-L实现,也可以在目录间加,分隔实现。

3)使包含库的目录包含在环境变量LIBARY_PATH中。

综上,

-save-temps: 会保存所有中间文件。

-fsyntax-only: 仅检查语法是否正确,不做预处理、编译等操作。

3)

gcc学习记录的更多相关文章

  1. gcc学习记录2——多输入文件

    首先有两个.c文件:circle.c和circulararea.c. 分别对两个源文件生成目标文件,circle.o和circulararea.o. gcc -c circle.c circularr ...

  2. 【golang学习记录】环境搭建

    [golang学习记录]环境搭建 一. 概述 本文是[golang学习记录]系列文章的第一篇,安装Go语言及搭建Go语言开发环境,接下来将详细记录自己学习 go 语言的过程,一方面是为了巩固自己学到的 ...

  3. GCC学习(1)之MinGW使用

    GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...

  4. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  5. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  6. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  7. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  8. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  9. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. SQLServer从其他表获取的数据更新该表的一部分

    在网上常见的是update  a  set  username  =  username  FROM b  on a.userid=b.userid,该更新语句是对a表中所有行进行更新.如果只更新一部 ...

  2. vue指令总结(二)

    一.vue指令 1.v-text v-text是用于操作纯文本,它会替代显示对应的数据对象上的值.当绑定的数据对象上的值发生改变,插值处的内容也会随之更新.注意:此处为单向绑定,数据对象上的值改变,插 ...

  3. windows添加快速启动栏

    步骤: 右击任务栏——选择“新建工具栏” 在“文件夹”路径中填入%appdata%\Microsoft\Internet Explorer\Quick Launch并单点“选择文件夹” 右键单击任务栏 ...

  4. 动态规划专题(四)——单调队列优化DP

    前言 单调队列优化\(DP\)应该还算是比较简单容易理解的吧,像它的升级版斜率优化\(DP\)就显得复杂了许多. 基本式子 单调队列优化\(DP\)的一般式子其实也非常简单: \[f_i=max_{j ...

  5. 深入理解计算机系统_3e 第九章家庭作业 CS:APP3e chapter 9 homework

    9.11 A. 00001001 111100 B. +----------------------------+ | Parameter Value | +--------------------- ...

  6. Python监控日志中经常访问的ip

    一.需求:每分钟检查一次日志文件,如果这一分钟内同一个ip请求次数超过200次,加入黑名单 1.日志文件中,每一行的格式为:XXX.XXX.XXX.XXX - - [04/Jun/2017:05:25 ...

  7. GPU并行编程:内核及函数的实现

    原文链接 回想一下我们之前在设备上使用“kernelFunction<<<1,1>>>(..)”执行一个函数的代码,我在那里还曾说过后面会细说,本文就详细介绍一下参 ...

  8. C#装箱与拆箱的研究

    在对这个问题展开讨论之前,我们不妨先来问这么几个问题,以系统的了解我们今天要探究的主题. 观者也许曾无数次的使用过诸如System.Console类或.NET类库中那些品种繁多的类.那么,我想问的是它 ...

  9. SQL Server中通用数据库角色权限的处理详解

    SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...

  10. java中char类型转换成int类型的两种方法

    方法一: char ch = '9'; if (Character.isDigit(ch)){ // 判断是否是数字 int num = Integer.parseInt(String.valueOf ...