010GCC程序编译
1、GCC的特点:
Gcc(GUN C Compiler)是GUN推出的功能强大、性能优越的多平台编译器,是GUN的代表作制衣。GCC可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%~30%。效率体现在编译出的文件小,花费时间短。
2、GCC基本使用方法:gcc [options] filenames
options:编译器所需要的编译选项
filenames:要编译的文件名
3、Gcc编译流程:
GCC编译器能将C/C++语言源程序、汇编程序形成可执行文件。真格形成过程可以被细分为四个阶段:
-E .c经过预处理形成.i (预处理:将宏替换到程序代码中)
-S .i经过编译形成.s
-c .s经过汇编形成.o
-o .o经过链接形成可执行文件
4、Gcc通过后缀来区别输入文件的类别:
.c为后缀的文件:C语言源代码文件
.a为后缀的文件:是由目标文件构成的库文件
.C,.cc或.cxx为后缀的文件:是C++源代码文件
.h为后缀的文件:头文件
.o为后缀的文件:是编译后的目标文件
.s为后缀的文件:是汇编预压源代码文件
5、Gcc编译选项:
-o output_filename:确定可执行文件的名称为output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out;
-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译,链接的速度就相应地慢一些;
-O2,比-O更好的优化编译、链接,但是,整个编译、链接过程会更慢;
优化:比如在程序中定义了一个名字为i的变量,但是整个程序运行过程中并没有使用这个变量,造成空间浪费,程序在编译时就能够发现这个问题,将没有用的东西优化掉。加上优化选项,就会将没有用的东西去掉,就不会造成浪费了。
统计程序的运行时间,可以用time命令,比如看hello的运行时间,执行的命令为:time ./hello
优化后的:
从两个图片的结果可以看出,优化并不影响程序的结果,但是效率更高!
-c:不链接,编译器只是由输入的.c等源代码文件编译生成.o为后缀的中间文件;
-g:产生调试工具(GNU的gdb)所需要的符号信息,要想对编译出的程序进行调试,就必加入这个选项;
-I dirname:将dirname所指出的目录作为编译器寻找头文件的标准路径;
C程序中的头文件包含两种情况:
#include <A.h>
#include "B.h"
对于<>,gcc在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;对于"",gcc在当前目录中搜寻头文件。-I选项的作用是告诉gcc,如果当前目录中没有找到需要的头文件,就到指定的dirname目录中去寻找。也可以直接在双引号中指明路径:#include "/usr/A.h"
范例:gcc foo.c -I /home/include -o foo
每一个编译器都有一个标准的寻找头文件的路径;
编译错误与编译警告都是我们的程序设计中经常遇到的问题。编译错误一般是代码中出现语法错误,程序无法编译执行,必须修改;编译警告是编译器发现程序中不合理的地方(比如类型不匹配),建议最好修改,但不修改也可以编译执行。
-Wall:生成所有警告信息
-w:不生成任何警告信息
-DMACRO:定义MACRO宏,等效于在程序中使用#define MACRO
使用方法:gcc -DPRINT macro.c -o macro
010GCC程序编译的更多相关文章
- 代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?
代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值? 解决:通过vs的预先生成命令中,添加批处理命令,删除对应的obj文件方式,强制 ...
- 简述 C、C++程序编译的内存分配情况【转】
面试题 9:简述 C.C++程序编译的内存分配情况 C.C++中内存分配方式可以分为三种: (1)从静态存储区域分配: 内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在.速度快. ...
- C程序编译过程浅析
前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧. 我现在一般都是用gcc,所以自然以GCC编译hellworld ...
- Java程序编译和运行的过程
Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode) 2 ...
- Java程序编译和运行的过程【转】
转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...
- .NET概念:.NET程序编译和运行
.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...
- 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程
汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...
- .NET程序编译和运行
一次面试的时候遇到的一道题目,简要说明.NET的编译过程,在网上看了很多资料,简单总结如下: 1.一般的编译过程 通常高级语言的程序编译过程是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最 ...
- (二)一个工作任务引起的乱战——C++程序编译为dll,让C#调用
C++程序编译为C#可调用的dll的过程: 1.新建一个Win32 Console Application 项目,项目名为:DLLDemo,下一步选择Application type为DLL; 2.在 ...
随机推荐
- java中四种引用类型(转)
今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在网上查资料,感觉收获颇多, ...
- ALITUM DESIGNER 多PIN脚IC元件封装的制作
多IC芯片的管教众多,一个一个的添加引脚效率较低,网上有好的方法,现总结如下 1 在元件库.schlib中新建元件,画出框图和添加第一个PIN脚 2利用smart paste快速放置众多PIN脚(具体 ...
- mongoDB索引使用
for(var i=0;i<10000;i++){ db.user.insert({name:"user"+i,age:i}) }添加这么多数据 db.user.find({ ...
- C#中调用Windows API的要点 .
介绍 API(Application Programming Interface),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能否认 ...
- 利用Hadoop实现超大矩阵相乘之我见(一)
前记 最近,公司一位挺优秀的总务离职,欢送宴上,她对我说“你是一位挺优秀的程序员”,刚说完,立马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被人瞧不起的工作吗?或许 ...
- C++学习42 输入和输出的概念
我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常 ...
- sql如何获取一个时间段内的月份
),) from master..spt_values where type='P' and dateadd(month,number,'2010-01-01')<='2010-09-01' / ...
- 动态添加js文件.
方法一: $.getScript(url,callback); 这个方法是对$.ajax({ })的封装.默认是异步的而且是带有缓存的. 缓存对于用户来说,是个好东西,但是对于开发者来说可就是日了狗的 ...
- NoCache
<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Ca ...
- X230上安装Yosemite/Win7-黑苹果之路
以前曾经在X230上安装了mavericks,但因为无线网卡问题最终作罢,现在换了SSD(128G).AR9285网卡,又冲刺了一把OSX,折腾了好几天,终于成了.特做记录如下: 首先,硬盘分区问题, ...