说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
GCC 参数详解
GCC基本知识
GCC发展历史
GCC的组成部分以及使用到的软件
GCC 各工具使用简介
Linux下七种文件类型、文件属性及其查看方法
Linux中,如何识别不同的文件类型
Linux下的文件类型及文件后缀名详解
Linux下七种文件类型、文件属性及其查看方法
认识GCC
GNU项目计划开发出几个广为流传的GNU软件:GNU C Commplier(gcc)、GNU emacs、GNU Debugger(gdb)、GNU Bash等。
一开始gcc只支持C语言,随着发展现今可支持多种语言,故现在的gcc已转变为:GNU Commplier Collection (GNU编译器家族)。部分工具如下表:
工具名 | 描述 |
---|---|
gcc | C 编译器 |
g++ | C++ 编译器 |
cpp | C 预处理器 |
as | GNU汇编器 一族汇编器,故可以被编泽后能够在各种不同平台上工作 |
ld | GNU 连接器 该程序将目标文件的集合组合成可执行程序 |
gdb | GNU 调试器 可用于检查程序运行时的值和行为 |
ar | 可通过从文档中增加、删除和析取文件来维护库文件 通常使用该工具是为了创建和管理连接程序使用的目标库文档 |
nm | 列出目标文件的符号表中定义的符号 |
objcopy | 目标文件翻译器,用于从连接器输出中创建一个ROM 映像 将目标文件从一种二进制格式复制和翻译到另外一种 |
objdump | 目标文件阅读器, 用于反汇编目标文件 显示一个或多个目标文件中保存的多种不同信息 |
autoconf | 产生的 shell 脚木自动配置源代码包去编泽某个特定版本的 UNIX |
make | 读取makefile 脚本确定程序中的编泽和连接的次序 |
readelf | 从 ELF 格式的目标文件显示信息 |
size | 列出目标文件中每个部分的名字和尺寸 |
strings | 浏览所有类型的文件,析取出用于显示的字符串 |
strip | 从目标文件或文档库中去掉符号表,以及其他调试所需的信息。 |
编译流程
由源程序形成可执行文件的过程被细分为以下四个阶段。
hello.c (源代码)
阶段一:预处理(preprocessing) || 【预处理器cpp】
hello.i(预编译后代码):在源代码中插入头文件,宏替换等(处理以“#”开始的预处理指令)。
阶段二:编译(compile) || 【编译器egcs】
hello.s(汇编源代码):编译器对代码优化,得到汇编文件。
阶段三:汇编(assembly) || 【汇编器as】
hello.o(目标文件):已经可执行的二进制文件。
阶段四:链接(link) || 【链接器ld】
hello(.out)(可执行文件):将目标文件与系统或用户提供的库链接为可执行文件。
Linux下文件后缀名:
.c 为后缀的文件:C语言源代码文件.
.C/.cc/.cxx 为后缀的文件:是C++源代码文件.
.h 为后缀的文件:头文件.
.i/.ii 为后缀的文件:已预处理过的C/C++源代码文件
.s 为后缀的文件:是汇编语言源代码文件.
.o 为后缀的文件:是编译后的目标文件.
.a 为后缀的文件:是由目标文件构成的静态库文件.
.so 为后缀的文件: 动态库文件
PS:
Windows下:文件可根据后缀名判断文件类型。
Linux下:文件不可根据后缀名判断文件类型,而是与文件属性有关。
可执行文件没有统一后缀名,而是根据文件属性区分可不可执行。
gcc可通过后缀区别输入文件类别。
编译选项
GCC编译选项大约有100多个,以下为最基本、最常用的。
-E:只运行C预编译器cpp,不生成文件 (只执行到第1阶段)
-S:只把文件编译成为汇编代码 (只执行到第2阶段)
-c:只生成object文件,不链接 (只执行到第3阶段)
编译器只是由输入的.c等源代码文件编译生成.o后缀的中间文件。
-o output_filename:确定可执行文件名为output_filename.(只执行到第4阶段)
若不给出这个选项,gcc就给出预设的可执行文件a.out.
-O或-O1:优化编译、连接。 -O2:优化编译、连接(优于-O)但过程会更慢。( 还有-O和-O3都类似)
整个源代码会在编译、连接过程进行优化处理,这样产生的可执行文件执行效率可提高。但编译、连接的速度就相应地慢一些。
-g:对编译出的程序进行调试。
产生调试工具(gdb),进行调试。
-Wall:生成所有警告信息、-w:不生成任何警告信息
编译错误:一般代码出现语法错误,无法编译执行,必须修改。
编译警告:编译器发现程序中出现不合理地方(ru:类型不匹配),建议最好修改(但也可编译执行)
-shared:生成支持动态共享库的执行文件
-static: 不支持动态共享库,把函数库内容静态链接到可执行程序中,生成的可执行文件不依赖库文件
-D macro=xxx:定义MACRO宏
等效于在程序中使用#define macro xxx
.
-I dirname:指定额外的头文件搜索路径dirname
将dirname所指目录作为编译器寻找头文件标准路径。有两种情况:
①< >
:在预设头文件目录下搜寻(如:/usr/include)。
②“ ”
:在当前目录下搜寻头文件。
若用-I则告诉gcc到指定dirname中寻找。
-L dirname:指定额外的库函数搜索路径dirname
会在系统目录/lib、/usr/lib下搜索,故需将对应的库防止系统目录下。
若动态库和静态库同名则优先动态库。
-l libraryname:指定链接时需要函数库
库名:liblibraryname.so/liblibraryname.a
,链接时去掉后缀.so
和版本号以及前缀lib
-fPIC:生成位置无关目标代码,适用于动态连接。
常用命令:
ldd
:列出一个程序所需要得动态链接库(so)
file
查看文件格式信息。
ldconfig
:在搜寻目录下搜索出可以共享的动态链接库