转载自:http://daimajishu.iteye.com/blog/1089740

对gcc认识一篇文章,就转载了,截取了自己感兴趣部分。

一,GCC编译器简介

虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。gcc 是一套完整的编译工具。

GCC是Linux平台下常用的编译链接器。编译链接的过程分为:

源代码-->预处理文件(.i)-->编译后的汇编代码(.s)-->汇编后的二进制文件(.o)-->链接后的二进制物件(无后缀)。

处理程序分别是 :cpp、ccl、as、ld。

使用 -v选项,可以看到各个阶段关联的处理程序。

使用gcc -E 指示gcc对源代码进行预处理,结果直接输出到终端。

使用gcc -S 指示gcc编译成为汇编语言

使用gcc -c 指示gcc直至形成二进制文件(不进行链接)

使用gcc 指示gcc链接形成二进制物件(多个二进制模块链接形成大的模块或者可执行程序)

因此你需要的目标文件的种类是 -E、-S、-c或者不带这些参数确定的,

源文件可以是中间文件的一种。-o参数控制的仅仅是输出文件的名称。

但是gcc默认会根据源文件的后缀去判断应该调用处理程序的那些。例如源文件的后缀是.c,则gcc -E使用的是cpp,gcc -c则使用cpp、ccl、as。如果源文件的后缀是.o,则gcc -E 是无法进行的,会报错:linker input file unused because linking not done。这是gcc发现这个应该进行链接,但是选项指示不使用linker程序,因而报这种错误信息。如果源文件是二进制的文件,但是保存的源文件后缀却是.c,则gcc会当作这是.c文件,如果采用gcc不带参数,则gcc会很多错,因为它把这个文件当作源代码处理的。

注意:这里,源文件指的是gcc的输入文件,源代码指的是程序源代码文件。

以下是使用gcc 不带-E、-S、-c这些参数时,将会进行的处理与输入文件后缀(类型)的对应关系。

使用-save-temps可以保存编译各个阶段的临时文件。

<!-- [if !mso]><mce:style><! v\:* {behavior:url(#default#VML);}o\:* {behavior:url(#default#VML);}p\:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}v\:textbox {display:none;}--><![endif]--><!-- [if !ppt]--><!-- [endif]-->

后缀 种类说明 源文件相应的后续处理
预处理 编译 汇编 链接
.c C 语言 程序
.C/.cc/.cxx C++ 语言 源程序
.h 源程序所包含的头文件 -- -- -- --
.i 经过预处理的 C 源程序
.ii 经过预处理的 C++ 源程序
.s 汇编语言源程序

.S 汇编语言源程序
.o 目标文件


.a 由目标文件构成的档案文件


<!-- [if !mso]><mce:style><! v\:* {behavior:url(#default#VML);}o\:* {behavior:url(#default#VML);}p\:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}v\:textbox {display:none;}--><!-- [endif]--><!-- [if !ppt]--><!-- [endif]-->

二,GCC常用编译选项

格式为:

gcc [option | filename] .......

gcc的命令可以分为如下几类:

1,全局选项 -c,-S,-E ,-o

2,目录选项 -Ipath,-Lpath

3,链接选项 -shared,-llibrary -Wl option

4,警告选项 -Wall, -Wextra,-Wconversion,-Wshardow,-Wcast-qual

5,调试选项 -g ,-ggdb

6,优化选项 -O, -O0,-O1,-O2,-O3

7,其它选项 -fPIC

部分选项简介:
-Wl,option : 传递 option 给链接程序 -Wl,-Bstatic : 明确限定链接静态库 ( 链接程序将不再接受动态链接库,直到再次指定 -Bdynamic) -Wl,-Bdynamic : 明确限定链接动态库 -fPIC : 生成动态链接用位置无关代码 (Position-independent code) -shared : 生成动态链接目标文件 -L : 指定链接阶段链接库所在路径 -l : 指定要链接的库(原库名去除前缀 lib 和后缀 .a/.so 的剩余部分)


1,创建动态库 :

1)gcc -fPIC -c -o test.o test.c

-fPIC表示产生位置无关代码(position independence code),

-c表示产生的是二进制文件,不进行链接,

-o表示产生的文件名。

2)gcc -shared -o libtest.so test.o

使用1)中编译的二进制文件,产生动态库

2,使用动态库

gcc -o main mian.c -L. -ltest

使用链接的库文件在前目录,名字为test。

3,创建静态库

1)gcc -c -o test.o test.c

-c表示产生的是二进制文件,不进行链接,

-o表示产生的文件名。

2)ar rcs libtest.a test.o

使用1)的二进制文件,产生静态库(文档文件)

4,使用静态库

gcc -o main main.c -L. -ltest

使用链接的库文件在当前目录,名字为test。


更多相关文章

  1. linux 服务器间文件传输
  2. 拆分gzip压缩日志文件而不将未压缩的拆分存储在磁盘上
  3. Linux 环境变量与文件查找
  4. 为什么Linux不需要磁盘碎片整理?——借以复习文件系统方面的知识
  5. Linux中的文件权限和用户组
  6. Linux学习之文件系统权限及表示
  7. linux 文件系统的管理 (硬盘) 工作原理
  8. Linux系统的文件传输工具RZSZ
  9. Linux:目录中的最新文件。

随机推荐

  1. Android平台开发-Android keypad map-And
  2. DDM dispatch reg wait timeout , Can't
  3. Android实现随屏幕旋转的TextView
  4. 笔记 RelativeLayout:相对布局管理器:
  5. Android2.2 API 中文文档系列(4) —— Mani
  6. Android单元测试之Local unit tests(下)
  7. Android项目开发一
  8. android 仿QQ手机版
  9. ConstraintLayout (约束布局)属性详情
  10. android 将图片通过base64转换为String