4gcc编译器
gcc编译器(GNU C Compiler)
现在我们所说的 gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pascal 等
gcc的主要特征
1: 可移植编译器,支持多种硬件平台
2:支持跨平台交叉编译(跨CPU)
3:多种语言前端,用于解析不同语言
4:按模块化设计,可以加入新语言和新CPU架构的支持
5:自由软件
gcc编译程序过程
1: 预处理(pre-processing)E
2: 编译(Compiling) S
3: 汇编(Assembling) c
4: 链接 (Linking)

gcc常用选项

gcc编译过程
预处理编译:gcc -E main.c -o main.i
编译成汇编:gcc -S main.i -o main.s
编译成二进制:gcc -c mian.s -o mian.o
连接,编译成可执行文件:gcc main.o -o main
执行:./main
一步编译:
gcc main.c -o main
运行:
./main
此处目标文件可不要扩展名。无意义,可用于识别。
-Wall 选项
增加所有编译告警
举例:
printf(“Four:%f\n”,4)
定义参数未使用等
头文件与库文件
库文件:预先编译好的函数集合,可重用,比如说 ncurse库(处理屏幕显示),dbm库(数据库访问)
头文件,库文件位置
-Ixxx 指定头文件目录为xxx
/usr/include/
/usr/local/include/
-Lxxx 指定lib目录为 xxx
/usr/lib/
/usr/local/lib/
使用外部#include<math.h>
#include<stdio.h>
int main()
{
double x=pow(2.0,3.0);
printf("Result:%f\n",x);
return 0;
}
gcc –Wall calc.c –o calc –lm (libm 数学函数库, lib省略)库
静态库与共享库(动态库)
静态库(.a): 程序在编译链接时候把库的代码链接到可执行文件中。程序运行时候,不再需要静态库
生成的可执行文件大,每个可执行文件都会加载一份拷贝到内存
共享库(.so或.sa): 程序运行时候才去链接共享库代码,多个程序共享使用
使用时候只需要加载一份到内存
共享库
共享库链接的可执行文件:包含了一个函数入口地址表
可执行文件运行时候,操作系统把外部函数从磁盘共享库中复制到内存(也就是动态链接)
操作系统采用虚拟内存机制,允许物理内存中一份共享库被所有需要的进程公用,节省内存和磁盘空间
生成静态库
静态库生成(libxxx.a):
gcc –c fun.c
生成 myslib.o
ar rcs libfun.a fun.o
生成 libMyslib.a
rcs: replace and create
静态库使用:
1: gcc –Wall main.c libfun.a –o main
2: gcc –Wall –L. main.c –o main –lfun
-L.表示在当前目录搜索 libfun.a
生成共享库(libxxx.so)
gcc –shared –fPIC fun.c –o libFun.so
shared:生成共享库格式
fPIC: 产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址
使用:
gcc –Wall main.o –o main –L. -lFun
头文件搜索路径
1:编译使用选项 –I 指定的目录
2:修改环境变量,搜索指定的目录(建议)
设置环境变量 C_INCLUDE_PATH (gcc)
设置环境变量 CPLUS_INCLUDE_PATH (g++)
临时修改: export C_INCLUDE_PATH =“_目录_”
永久修改: ~/.profile 文件中,增加一行上述命令
3:头文件放入系统include目录
链接库搜索路径
1:编译使用选项 –L 指定目录
2:修改环境变量,搜索指定的目录(建议)
设置环境变量 LIBRARY_PATH
3:把生成的lib文件放入系统lib目录
运行库搜索路径
1:修改环境变量,搜索指定的目录(建议)
设置环境变量 LD_LIBRARY_PATH
2: 修改配置 /etc/ld.so.conf
增加环境变量 LD_LIBRARY_PATH
修改完成后使用 ldconfig 命令进行刷新
3:生成的lib文件放入系统lib目录
ldd命令:
ldd [exeFile] 查看exeFile调用的动态库
注意:
1. 两个库同时存在,优先使用的是共享库
2. 使用静态库,编译好可执行文件后,删除静态库,可执行文件无影响,但是共享库不能删除。
4gcc编译器的更多相关文章
- python开发编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...
- 使用 Roslyn 编译器服务
.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...
- 编译器开发系列--Ocelot语言7.中间代码
Ocelot的中间代码是仿照国外编译器相关图书Modern Compiler Implementation 中所使用的名为Tree 的中间代码设计的.顾名思义,Tree 是一种树形结构,其特征是简单, ...
- 编译器开发系列--Ocelot语言1.抽象语法树
从今天开始研究开发自己的编程语言Ocelot,从<自制编译器>出发,然后再自己不断完善功能并优化. 编译器前端简单,就不深入研究了,直接用现成的一款工具叫JavaCC,它可以生成抽象语法树 ...
- 从Unity3D编译器升级聊起Mono
接前篇Unity 5.3.5p8 C#编译器升级,本文侧重了解一些Mono的知识. Unity3D的编译器升级 新升级的Mono C#编译器(对应Mono 4.4) Unity编辑器及播放器所使用的M ...
- 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)
基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#) 为了完美解析GLSL源码,获取其中的信息(都有哪些in/out/uniform等),我决定做个GLSL编译器的前端(以后简称编译器或 ...
- 在 CSS 预编译器之后:PostCSS
提到css预编译器(css preprocessor),你可能想到Sass.Less以及Stylus.而本文要介绍的PostCSS,正是一个这样的工具:css预编译器可以做到的事,它同样可以做到. “ ...
- 匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的
0x00 前言 由于工作繁忙所以距离上一篇博客已经过去一个多月的时间了,因此决心这个周末无论如何也得写点东西出来,既是总结也是分享.那么本文主要的内容集中在了委托的使用以及内部结构(当然还有事件了,但 ...
- Keil> 编译器特有的功能 > 关键字和运算符 > __weak
__weak 此关键字指示编译器弱导出符号. 可以将 __weak 关键字应用于函数和变量声明以及函数定义. 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不 ...
随机推荐
- python2.0_s12_day10_Twsited异步网络框架
Twsited异步网络框架 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. Package application Configu ...
- ContentPriver
共享应用程序内的数据, 在数据修改时可以监听 1.特点 ①.可以将应用中的数据对外进行共享: ②.数据访问方式统一,不必针对不同数据类型采取不同的访问策略: ③.内容提供者将数据封装,只暴露出我们希望 ...
- CentOS6.4配置163的yum源
CentOS系统自带的更新源的速度实在是慢,为了让CentOS6使用速度更快的YUM更新源,可以选择163(网易)的更新源. 1.下载repo文件 wget http://mirrors.163.co ...
- 《C++ Primer Plus》第13章 类继承 笔记
类继承通过使用已有的类(基类)定义新的来(派生类),使得能够根据需要修改编程代码.共有继承建立is-a关系,这意味着派生类对象也应该是某种基类对象.作为is-a模型的一部分,派生类继承基类的数据称源和 ...
- KVC与Runtime结合使用(案例)及其底层原理
一.KVC 的用法和实践 用法 KVC(Key-value coding)键值编码,顾名思义.额,简单来说,是可以通过对象属性名称(Key)直接给属性值(value)编码(coding)“编码”可以理 ...
- mysql 数据表读锁机制详解
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制.一.概述MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(tab ...
- poj_2286 IDA*
题目大意 给定一个由数字组成的#字型网格,和一定的移动规则,问最少需要多少次移动才能达到要求的结果. 题目分析 要求最少需要几步到达结果,可以考虑广度优先搜索算法,或者迭代加深深度优先搜索(IDA*) ...
- java EE ME SE有什么关系
1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程 ...
- 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治
[BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...
- ios获取设备手持方向——电子罗盘
转:http://book.51cto.com/art/201411/457105.htm 2014-11-15 19:07 张亚飞/崔巍 中国铁道出版社 字号:T | T 综合评级: 想读() 在 ...