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编译器的更多相关文章

  1. python开发编译器

    引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...

  2. 使用 Roslyn 编译器服务

    .NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...

  3. 编译器开发系列--Ocelot语言7.中间代码

    Ocelot的中间代码是仿照国外编译器相关图书Modern Compiler Implementation 中所使用的名为Tree 的中间代码设计的.顾名思义,Tree 是一种树形结构,其特征是简单, ...

  4. 编译器开发系列--Ocelot语言1.抽象语法树

    从今天开始研究开发自己的编程语言Ocelot,从<自制编译器>出发,然后再自己不断完善功能并优化. 编译器前端简单,就不深入研究了,直接用现成的一款工具叫JavaCC,它可以生成抽象语法树 ...

  5. 从Unity3D编译器升级聊起Mono

    接前篇Unity 5.3.5p8 C#编译器升级,本文侧重了解一些Mono的知识. Unity3D的编译器升级 新升级的Mono C#编译器(对应Mono 4.4) Unity编辑器及播放器所使用的M ...

  6. 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)

    基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#) 为了完美解析GLSL源码,获取其中的信息(都有哪些in/out/uniform等),我决定做个GLSL编译器的前端(以后简称编译器或 ...

  7. 在 CSS 预编译器之后:PostCSS

    提到css预编译器(css preprocessor),你可能想到Sass.Less以及Stylus.而本文要介绍的PostCSS,正是一个这样的工具:css预编译器可以做到的事,它同样可以做到. “ ...

  8. 匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的

    0x00 前言 由于工作繁忙所以距离上一篇博客已经过去一个多月的时间了,因此决心这个周末无论如何也得写点东西出来,既是总结也是分享.那么本文主要的内容集中在了委托的使用以及内部结构(当然还有事件了,但 ...

  9. Keil> 编译器特有的功能 > 关键字和运算符 > __weak

    __weak 此关键字指示编译器弱导出符号. 可以将 __weak 关键字应用于函数和变量声明以及函数定义. 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不 ...

随机推荐

  1. IIC协议

    总线信号 :  SDA :串行数据线 SCL  :串行时钟 总线空闲状态 : SDA :高电平 SCL :高电平 起始位:SCL为高电平期间    SDA出现下降沿 终止位:SCL为高电平期间 SDA ...

  2. Apktool源码解析——第二篇

    上一篇讲到ApkDecoder这个类,大部分调用到还是Androlib类,而且上次发现brutall的代码竟然不是最新的,遂去找iBotP.的代码了. 今天来看Androlib的代码: private ...

  3. yield方法

    yield方法的作用是房企当前的CPU资源,将他让给其他的任务去占用CPU执行时间,但房企的时间不确定,有可能刚刚放弃,马上又获得CPU时间片. package yield; /** * Create ...

  4. JZOJ.5331【NOIP2017模拟8.23】壕游戏

    Description

  5. parseInt()解析整数与parsetFloat()解析浮点数

    1.parseInt(string,radix) 解析整数 parseInt("dgei23"); // NaN parseInt("3 blind mice" ...

  6. 【BZOJ2502】清理雪道 有上下界的网络流 最小流

    [BZOJ2502]清理雪道 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...

  7. java父类可以强制转化成子类吗?

    转自:http://blog.csdn.net/ld422586546/article/details/9707997 Java中父类强制转换成子类的原则:父类型的引用指向的是哪个子类的实例,就能转换 ...

  8. Zend_Framework_1 框架是如何被启动的?

    Zend Framework 1 是一个十年前的老框架了,我接触它也有两年了,现在来写这篇文章,主要原因是最近要写入职培训教程.公司项目基本上都是基于Zend1框架,即使现在要转 Laravel 也肯 ...

  9. MVC之Filter

    过滤器的理解 Filter就是过滤器,在WebForm中,各种管道事件就是相当于过滤器,在MVC中,过滤器是单独的一种机制,分为方法过滤器和异常处理过滤器,方法过滤器实现的功能是在执行某一个请求得方法 ...

  10. C#操作word之插入图片

    假如我们导出一份简历到word文档,那势必可能要同时导出我们包含的简历,下面就来试一下如何和通过C#代码,将图片插入到word文档中. 为了简便起见,就简单一点.类似下面这样的 姓名 张三 照片   ...