【Linux】GCC程序开发工具(上)
00. 目录
00. 目录01. GNU工具概述02. 常用文本文件03. 常用二进制文件04. Binutils工具集05. GCC工具06. 附录
01. GNU工具概述
在Linux中,GNU Tools是主要的程序的开发工具,这组工具主要用于生成代码和分析程序。GNU Tools最重要的组成部分是GCC。GCC是GNU Compiler Collection的缩写,是一个非常优秀的跨平台编译器集合,支持x86、ARM、MIPS和PowerPC等多种目标平台,支持C、C++、Java、ADA、Fortran和Pascal等多种高级语言。
GCC能完成从C、C++、Objective-C等源文件向运行在特定CPU硬件上的目标代码的转换。对于通用计算机、一般使用GCC生成x86的可执行代码,对于嵌入式开发系统使用交叉编译GCC,生成目标机可以执行的程序。
02. 常用文本文件
*.c C语言源文件
*.C *.cxx *.cc C++语言源文件
*.i 预处理后的C语言源文件
*.ii 预处理后的C++语言源文件
*.s *.S 汇编语言文件
*.h 头文件
03. 常用二进制文件
*.o 目标文件
*.so 动态库
*.a 静态库
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;
.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;
.m为后缀的文件,是Objective-C源代码文件;
.mm为后缀的文件是Objective-C++源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
04. Binutils工具集
GCC是一组工具的集合,包含了预处理器、编译器、汇编器、连接器部分。当使用GCC的时候,将根据需要调用相应的工具。对于默认的文件名,GCC可以自动选择工具来完成文件处理过程。从C语言的源程序到可执行文件的转换,实质上是依靠GCC调用一系列工具完成的。
Binutils是一个二进制工具的集合,包含了汇编、链接以及一系列的辅助工具。binutils是辅助GCC的重要工具集,主要包含以下的工具。
as:GNU汇编器,用于将处理器的汇编格式代码转换成可执行代码,并存储到目标文件.o文件中
ld: GNU连接器,用于将一个或者多个目标文件(.o)、库组合成一个可执行的程序,或者生成静态库或者静态库。
ar: 归档工具,可以将多个文件组合成一个大文件,并且可以读取原始文件的内容
strip: 去除文件中的符号
nm: 可以i显示目标文件中的符号
objcopy: 转换二进制代码的工具,可以将二进制代码转换成各种格式
objdump: 显示目标文件的反汇编工具
readelf: 显示ELF文件的各种信息
strings: 显示文件中可打印字符
ranlib: 产生归档文件的索引,并将其保存到归档文件中。
gprof: 显示程序调用段的各种信息。
05. GCC工具
5.1 gcc用法参考
[root@deng test]# gcc --help
用法:gcc [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径
-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-Xassembler <参数> 将 <参数> 传递给汇编器
-Xpreprocessor <参数> 将 <参数> 传递给预处理器
-Xlinker <参数> 将 <参数> 传递给链接器
-combine 将多个源文件一次性传递给汇编器
-save-temps 不删除中间文件
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-B <目录> 将 <目录> 添加到编译器的搜索路径中
-b <机器> 为 gcc 指定目标机器(如果有安装)
-V <版本> 运行指定版本的 gcc(如果有安装)
-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-E 仅作预处理,不进行编译、汇编和链接
-S 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
-o <文件> 输出到 <文件>
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c++ assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言
-w 不显示警告信息
-W 指定需要显示的警告信息
-Wall 表示显示所有的警告信息
-Werr 将警告信息当成错误、并终止编译
-DMACRO 定义宏MACRO为字符串1
-DMACRO=DEF 定义MACRO宏为字符串DEF
-UMACRO 取消对MACRO宏的定义
-ggdb 生成可被gdb使用的标准调试信息
-mXXX 针对XXX CPU进行优化,例如XXX可以是486 586等
-O0 不进行代码优化
-O或者-O1 进行一般的代码优化,减少执行代码大小和执行的时间
-O2 比-O1进行更多的优化,减少执行代码大小和执行的时间
-O3 比-O2更进一步优化
-MM 输出源文件的依赖关系
-ansi 编译器将所有的gnu的编译器特性都关掉,可以让程序和Ansi标准兼容
-include file 编译之前将file包含进去,相当于在所有编译的源文件最前面加入include <file>语句
-imacros file 与-include file一样,不过这个文件在具体编译的时候只有里面定义的宏才起作用,所以只用来在file文件中定义宏
-nostdinc 在搜寻include的文件路径中去掉标准的C语言头文件搜索路径,例如stdin.h文件就是放在标准头文件搜索路径下。
-C 通-E参数配合使用,让预处理后的结果保留注释,一遍程序更易读。
-nostartfiles 在链接的时候不把系统相关的启动代码链接起来
-nostdlib 在链接的时候不把标准库链接进来
以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。
5.2 参考示例
[root@deng test]# ls
a.out main.c myputs.c myputs.h test.c test.h
[root@deng test]# gcc -pipe -g -Wall -I. -c test.c -o test.o
[root@deng test]#
#解释
-g: 表示含有调试信息
-Wall: 表示输出所有的警告
-I. 表示包含当前目录作为头文件搜索路径,这个选项用于增加搜索头文件的路径
-pipe: 表示使用管道替换临时文件
-o: 指定输出地目标文件的名称