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.在 ...
随机推荐
- html_
============= 博客大全: 脚本之家:http://www.jb51.net/list/list_233_104.htm 红黑联盟: http://www.2cto.com/kf/yid ...
- css如何让表格table的边框为1像素呢
在Html中使用table是网页制作中必不可缺的一部分,如果直接给css设置table里面的td边框为1像素的话,那么实际我们从网页上看到的效果却不是1像素. 那么我们怎么用css让table的边框为 ...
- contentprovider提供程序间共享数据的统一接口
contentprovider提供程序间共享数据的统一接口
- java生成验证码图片
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...
- ruby1.8到2.1语法改变
1定义hash的语法改变old_way = {:foo => "bar", :one => 1}new_way = {foo: "bar", one ...
- 第6章 System V消息队列
6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...
- Ubuntu 之 initramfs 报错解决之一
问题出现: ubuntu 更新后,编辑文件提示权限不够,并提示更新错误,重启后进入 initramfs ,仔细看提示错误有: file system check of the root filesys ...
- Java中的大数处理类BigInteger和BigDecimar浅析
这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; BigInteg ...
- mssqlserver 批量插入示例
public bool DoQuestionSqlBulkCopy(DataTable dtDoQuestion, string DoQuestionName, ...
- (转)Java DES 与Base64
原文地址http://blog.csdn.net/tomatozq/article/details/20773559 1,DES /** * 解密 * @param message * @param ...