Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43308
  • 博文数量: 25
  • 博客积分: 1280
  • 博客等级: 中尉
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-20 18:26
文章分类
文章存档

2011年(23)

2010年(2)

我的朋友

分类: LINUX

2011-03-01 11:49:17

先说明一下程序的编译过程(大部分程序设计语言),然后再介绍gcc这个编译器的参数使用方法,你就会对使用gcc进行c程序的编译过程有总体的了解了.
 
1.预处理阶段
2.编译阶段
3.优化阶段
4.汇编阶段
5.连接阶段
 
-o FILENAME                
指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out.
gcc test.c -o first 这样就编译出一个名为first的程序.(1 2 3 4 5)

-c                
只编译不链接(连接?)
没有将函数库中的内容复制到可执行文件中,一般是多人分工合作时每人做一部分,-c 生成.o目标文件,最后把所有的目标文件拿到一起连接.  (1 2 3 4)
连接使用ld命令,如:ld f1.o f2.o /lib/libc.a 然后可以生成一个可执行文件.(5)
[注]/lib/libc.a是库名,必须将它放在.o目标文件之后!


-D FOO=BAR        
在命令行定义预处理宏FOO,其值为BAR
与在程序中处理一样
#define FOO BAR

-I DIRNAME        
将DIRNAME加入到头文件的搜索目录列表中.
在这里多说两句,程序的头文件一般有三种形式:
#include
#include "mylib.h"
#include "/usr/person/lib/mylib.h"
第一种形式,编译器看到<>,就会到存放C库函数的目录中寻找包含的文件,一般在/usr/include路径下,这称为标准形式。
第二种形式,编译器看到"",会先在用户当前的目录下寻找要包含的文件,如果没有找到,再按标准方式查找。
第三种形式,也是"",但是包含路径,编译器先会在当前路径搜索,没找到去指定的路径下寻找要包含的文件,若仍没找到,会按标准方式查找,如果还没找到,会报错,十有八九是你""里的路径写错了。
这里的-I 参数可以第二种情况下使用,给出路径后,编译器的处理过程就和第三种情况一样了。
gcc test.c -o second -I /usr/person/lib  (可以是相对路径)
 

-L DIRNAME        
将DIRNAME加入到库文件的搜索目录列表中,缺省情况下gcc 只链接共享库
与-I 参数功能相同,只是这个参数可以指定多个路径,具体来说参数内容必须是用:隔开的路径名称(绝对路径)的列表,列表元素之间以;分隔
gcc test.c -o third -I /usr/person/lib -L dir1:dir2;dir3:dir4/


-static                
链接静态库,即执行静态链接

-lFOO                
链接名为libFOO的函数库

-g                
在可执行程序中包含标准调试信息

-ggdb                
在可执行程序中包含只有GNU debugger才能使别的达两条是信息

-O                
优化编译过的代码

-ON                
指定代码优化的级别为N,o<=N<=3

-ansi                
支持ANSI/ISO C的标准语法,取消GNU的语法扩展中与该标准有冲突的部分
(但这一选项并不能保证生成ANSI兼容的代码)

-pedantic        
允许发出ANSI/ISO C标准所列出的所有警告

-pedantic -errors        
允许发出ANSI/ISO C标准所列出的所有错误

-traditional        
支持Kernighan & Ritchie C语法(如用旧式语法定义函数);如果不知道这个选项的含义,也没有关系

-w                 
关闭所有警告,建议不要使用此项

.Wall                
允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告

-werror                
把所有警告转换为错误,以在警告发生时中止编译过程                              

-MM                
输出一个make兼容的相关列表

-v                
显示在编译过程的每一步中用到的命令

 原文地址 
阅读(763) | 评论(1) | 转发(0) |
0

上一篇: I/O端口 与 I/O内存

下一篇:ARM 与 MIPS 比较

给主人留下些什么吧!~~

chinaunix网友2011-03-05 16:45:01

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com