gcc编译系统
一、 C语言编译过程
C语言的编译过程可分为四个阶段:
1、预处理(Preprocessing)
对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程。
伪指令包括:1)宏定义指令;
2)条件编译指令;
3)头文件包含指令;
2、编译(Compilation)
编译就是将源程序转换为计算机可以执行的二进制代码。
说明:
在Linux下,目标文件的缺省后缀为.o
编译程序将通过词法分析和语法分析,将其翻译成为等价的汇编代码。
在使用gcc进行编译时,缺省情况下,不输出这个汇编代码的文件。如果需要,可以在编译时指定-S选项。这样,就会输出同名的汇编语言文件。
3、汇编(Assembly)
汇编的过程实际上是将汇编语言代码翻译成机器语言的过程。
产生一个扩展名为.o的目标文件。
4、链接(Linking)
目标代码不能直接执行,要想将目标代码变成可执行程序,还需要进行链接操作。才会生成真正可以执行的可执行程序。
链接操作最重要的步骤就是将函数库中相应的代码组合到目标文件中。
二、文件名后缀
gcc可以针对支持不同的源程序文件进行不同的处理,文件格式以文件的后缀来识别。
文件名后缀 |
文件类型 |
.c |
C源文件 |
.C .cpp .cc .c++ .cxx |
C++源文件 |
.h |
头文件 |
.i |
预处理后的C源文件 |
.s |
汇编程序文件 |
.o |
目标文件 |
.a |
静态链接库 |
.so |
动态链接库 |
三、 gcc编译器简介
gcc(GNU Compiler Collection)
在Linux平台上最常用的C语言编译系统是gcc,它是GNU项目中符合ANSI C标准的编译系统。
gcc的使用格式:
gcc [options][filenames]
说明:当不用任何选项时,gcc将会生成一个名为a.out的可执行文件。
例子:在linux上编译一个c程序(文件名为hello.c ;执行gcc hello.c)。
#include <stdio.h>
int main()
{
printf("hello world.\n");
return 0;
}
运行编译好的可执行c文件命令是./a.out
四、gcc编译器的工作过程
1、预处理(Preprocessing)
2、编译(Compilation & Assembly)
源代码转换为汇编语言(在编译时选择-S选项,可以看到生成的汇编代码.s文件)
汇编代码(.s)转换为目标代码(.o)
3、链接(Linking)
将目标代码与各库函数进行链接并重定位,生成可执行程序。
五、gcc命令行选项
1、预处理选项
选项 |
说明 |
-D name |
定义一个宏name,并可以指定值 |
-I dir |
指定头文件的路径dir。先在指定的路径中搜索要包含的头文件,若找不到,则在标准路径(/usr/include,/usr/lib及当前工作目录)上搜索。 |
-E |
只对文件进行预处理,不进行编译、汇编、链接,生成的结果送标准输出 即:只运行C预编译器 |
-o file |
将输出写到指定的文件file中 即:产生目标(.i 、.s 、 .o 、可执行文件等) |
例子:使用 -I选项包含保存在非标准位置中的头文件。
# gcc -I/usr/openwin/include file.c
例子:使用-D选项定义宏,其作用等价于在源文件中使用宏定义指令。
main()
{
printf("display -D variable %s\n",DOPTION);
printf("hello,everybody!!\n");
}
# gcc -D DOPTION='"testing -D"' hello.c
2、编译程序选项
选项 |
说明 |
-o file1 file2 |
将文件file2编译成可执行文件file1。 如果未使用该选项,则可执行文件放在a.out中 |
-S |
只进行编译,不进行汇编,生成汇编代码文件扩展名为.s 即:告诉编译器产生汇编语言文件后停止编译 |
-c |
只把源文件编译成目标代码.o,不进行汇编、链接。 用于实现对源文件的分别编译 |
-g |
在目标代码中加入供调试程序gdb使用的附加信息 |
-v |
显示gcc版本 |
-Wall |
显示警告信息 |
例子:在gcc中使用-W控制警告信息。
# gcc -Wall -o hello1 hello1.c
例子:使用gcc的-g选项来产生调试符号,
# gcc -g -o test1 test1.c
例子:多文件的编译。
//meng1.c
#include <stdio.h>
main()
{
int r;
printf("enter an integer,please!\n");
scanf("%d",&r);
square(r);
return 0;
}
//meng2.c
#include <stdio.h>
int square(int x)
{
printf("The square=%d\n",x*x);
return (x*x);
}
编译方法一:
# gcc -c meng1.c
# gcc -c meng2.c
# gcc meng1.o meng2.o -o meng12
编译方法二:
# gcc -o meng13 meng1.c meng2.c
说明:
方法二不产生中间目标文件,直接生成一个可执行文件,因而,程序内容稍有改动,就要重新编译全部程序。
3、优化程序选项
优化是编译器的一部分,它可以检查和组合编译器生成的代码,指出未达到最优的部分,并重新生成它们,从而使用户编写的程序更加完美且节省空间。
在gcc编译器选项中,使用-O选项对代码进行优化。
优化级别分3级,由高到低分别为:-O3、-O2、-O1,
优化程序选项
选项 |
说明 |
-O1(-O) |
对编译出的代码进行优化 |
-O2 |
进行比-O高一级的优化 |
-O3 |
产生更高级别的优化 |
说明:
-O1(或-O)、-O2、-O3分别代表优化级别,数字越高,代表gcc的优化级别越高,高的优化级别代表着程序将运行的更快。
优化级别越高则程序量越大。
直接优化程序本身,性能的提高的变化更加明显。
4、连接程序选项
库:是一组预先编译好的函数集合。
说明:
标准库文件一般存储在/lib和/usr/lib目录中。
所有的库名都以lib开头。例如:libc.so(标准C语言函数库)、libm.so(数学运算函数库)
以.a结尾的是静态库;以.so结尾的库是动态库。
使用ar工具将目标文件收集起来,放到一个归档文件中。
连接程序选项
选项 |
说明 |
-L dir |
将dir所指出的目录加到“函数库搜索列表”中 |
-llib |
链接lib库 |
-I name |
连接时,加载名字为name的函数库。该库位于系统预设的目录或者由-L选项确定的目录下。 实际的库名是libname(后缀为.a或.so) |
说明:
链接过程通常的形式如下:
gcc -o file file.o -L dirname -lxxx
-L:指定了链接时用到的库文件所在的目录。
-lxxx:指示链接的库函数名为libxxx.a
例子:编译产生可执行文件hello,搜索数学库以解决问题。
# gcc -o hello hello.c /usr/lib/libm.a
或者
# gcc -o hello hello.c -lm
例子:创建一个小型库
包含两个函数pro1、pro2,然后在示例程序中调用其中一个函数。
/* pro1.c */
#include <stdio.h>
void pro1(int arg)
{
printf("hello:%d\n", arg);
}
/* pro2.c */
#include <stdio.h>
void pro2(char *arg)
{
printf("welcome to:%s", arg);
}
/* lib.h */
void pro1(int);
void pro2(char *);
/* program.c */
#include "lib.h"
int main()
{
pro2("Linux world.");
exit(0);
}
gcc编译系统的更多相关文章
- GCC编译器原理(一)------交叉编译器制作和GCC组件及命令
1.1 交叉编译器制作 默认安装的 GCC 编译系统所产生的代码适用于本机,即运行 GCC 的机器,但也可将 GCC 安装成能够生成其他的机器代码.安装一些必须的模块,就可产生多种目标机器代码,而且可 ...
- oracle linux了解基本命令行
1. Linux的版本:核心(kernel)版本和发行(distribution)版本 2. 复制.删除和移动文件的命令 cp [选项] 源文件或目录 目标文件或目录 -R,-r ...
- (转)C的代码是如何变成程序的
原文链接:http://blog.csdn.net/fz_ywj/article/details/8769825 C语言是一门典型的编译语言,源代码文件需要编译成目标代码文件才能运行.可以认为程序文件 ...
- 转:GCC,LLVM,Clang编译器对比
GCC,LLVM,Clang编译器对比 转自: http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html 在XCode中, ...
- 20135328信息安全系统设计基础第二周学习总结(vim、gcc、gdb)
第三周学习笔记 学习计时:共8小时 读书:1 代码:5 作业:1 博客:7 一.学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 ...
- GCC 编译详解
GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...
- 暑假热身 A. GCC
GCC编译器是一个由GNU项目维护的编译系统,它支持多种编程语言的编译.但是它并不包含数学运算符“!”.在数学中,这个符号代表阶乘.表达式n!的意思是从1到n的所有整数的乘积. 例如,4!=4*3*2 ...
- windows下安装,配置gcc编译器
在Windows下使用gcc编译器: 1.首先介绍下MinGW MinGW是指仅仅用自由软件来生成纯粹的Win32可运行文件的编译环境,它是Minimalist GNU on Windows的略称. ...
- Linux 内核的编译系统
Linux 的编译使用 GNU make 工具来检查整个系统的文件和调用 gcc 工具以及脚本完毕编译源码生成 image 等操作.要了解整个编译系统,我们首先要了解 Linux 内核的 Makef ...
随机推荐
- POJ 2513 无向欧拉通路+字典树+并查集
题目大意: 有一堆头尾均有颜色的木条,要让它们拼接在一起,拼接处颜色要保证相同,问是否能够实现 这道题我一开始利用map<string,int>来对颜色进行赋值,好进行后面的并查操作以及欧 ...
- BZOJ 1221: [HNOI2001] 软件开发【最小费用最大流】
Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...
- POJ 2391 Ombrophobic Bovines【二分 网络流】
题目大意:F个草场,P条道路(无向),每个草场初始有几头牛,还有庇护所,庇护所有个容量,每条道路走完都有时间,问所有奶牛都到庇护所最大时间最小是多少? 思路:和POJ2112一样的思路,二分以后构建网 ...
- jQuery根据属性模糊匹配元素
1.查看带有指定属性的元素: [attribute] 例如: $("div[id]") 2.查看属性值是某个特定值的元素: [attribute=value] 例如: $(&quo ...
- windows 配置 apache的多个站点
windows 配置apache的多个站点 第一步打开apache的conf/extra/httpd-vhosts.conf,复制<VirtualHost></VirtualHost ...
- Bootstrap3 为何无法显示Glyphicons 图标
Bootstrap3 为何无法显示Glyphicons 图标 在CSS引入字体即可解决 @font-face { font-family: 'Glyphicons Halflings'; src: u ...
- T1365 浴火银河星际跳跃 codevs
http://codevs.cn/problem/1365/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 K 又在玩浴 ...
- Protobuf 完整解析 - 公司最常用的数据交互协议
Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关.语言无关.可扩展,可用于通讯协议和数据存储等领域. 数据交互xml.json.pro ...
- Ubuntu 16.04关闭Alt+鼠标左键移动窗口(转)
1.打开终端,菜单-编辑-配置文件首选项-命令,勾上“以登录Shell方式运行命令”,重启终端. 2.在终端输入 gsettings get org.gnome.desktop.wm.preferen ...
- python读取大文件的方法
python计算文件的行数和读取某一行内容的实现方法 :最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的 ...