gcc/g++
编译器使用
参考:《UNIX 系统与 软件开发 》中国铁道出版设 邵国金主编 第十章 编程基础篇
一、gcc/g++所用文件扩展名约定
扩展名 |
文件类型 |
扩展名 |
文件类型 |
.c |
C语言源代码 |
.S |
未预处理的汇编程序 |
.C,.cp,.cc,.c++,.cpp |
c++语言源代码 |
.h |
头文件 |
.i |
预处理后的c源代码文件 |
.o |
目标文件 |
.ii |
预处理后的cpp源代码文件 |
.a |
静态库文件 |
.s |
预处理后的汇编程序 |
.so |
共享库文件 |
二、gcc/g++用法
gcc/g++常用格式:
gcc/g++
[-E] [-S] [-c] [-s] [-v] [-I(upper(i))dir ...] [-Ldir ...] [-l(lower(L))libname]
[-static] [-shared] [-rdynamic] [-D macro[=defn] ...] [-Umacro]
[-fopt ...] [ -Wwarn ...] [-x language] [-mmachine-option ...]
[-o outfile] [@file] infile ....
编译器gcc/g++ 按命令行选项指定到功能对源文件infill 进行编译处理,参数选项如下。
参数 |
意义 |
-E |
只对文件进行预处理,不进行编译和链接,可用-o指定输出文件 |
-S |
仅在预处理后输出汇编语言文件*.s,可用-o指定输出文件 |
-c |
仅在编译后生成同主名的*.o型到目标文件,可用-o指定输出文件 |
-s |
生成可执行文件时,删除符号表和重定位信息(生成成品软件时使用或不使用) |
-g |
在可执行文件中加入调试信息(调试时使用) |
-o outfile |
指定输出文件名。生成可执行文件时,若不指定则默认生成a.out |
-Idir |
将目录dir添加到头文件搜索范围 |
-Ldir |
将目录dir添加到库文件搜索范围 |
-lname |
指定要链接的库名 |
-mmachine-option |
与硬件相关到选项 |
-Olevel |
编译时进行优化 |
-static |
禁止使用共享库(动态链接库) |
-shared |
生成共享库 |
-rdynamic |
通知连接器将所有符号添加到动态符号表中 |
-Dname[=val] |
宏定义变量name[=val] |
-Uname |
取消宏定义变量name |
-x language |
指定前端语言 |
-v |
显示gcc版本 |
-Wwarn |
警告信息控制,例如-Wall |
-fopt |
-f选项又很多,例如 -fpic/-fPIC 用于生成位置无关代码 |
@file |
用于从file中读取选项 |
三、gcc/g++的工作工程
gcc/g++将一个c/c++程序编译成可执行程序要经过四个步骤:预处理,编译,汇编,连接。
c/c++源代码 ->
预处理 -> c/c++编译程序 -> 汇编代码 ->
汇编程序 -> 目标代码 -> 连接程序 -> 可执行代码
预处理 (-E) 使用-ofile指定输出文件,否则预处理结果输出到屏幕,此部分工作由预处理程序cpp(C Preprocesor )完成。
编译 (-S)使用-ofile指定输出文件,否则生成同名的.s文件,此部分工作由编译程序gcc完成。
汇编(-c)使用-ofile指定输出文件,否则生成同名的.o文件,此部分工作由汇编程序ac (assembler)完成。
连接 使用-ofile指定输出文件,否则生成文件名为a.out的可执行程序,此部分工作由连接程序ld完成。