一.gcc编译器
1.1编译步骤
分为1.预处理 2.编译 3.汇编 4.链接 四个步骤。
详情 http://blog.youkuaiyun.com/thank_t_f/article/details/79539096
1.2文件类型约定
文件后缀名 | 文件类型约定 |
---|---|
.c | C语言源代码文件 |
.a | 由目标文件构成的档案库文件 |
.C 或.cc或 .cxx | C++源代码文件 |
.h | 程序包含的头文件 |
.i | 经处理过的C源代码文件 |
.ii | 经处理过的C++源代码文件 |
.m | Objective-C源代码文件 |
.o | 编译后的目标文件 |
.s | 汇编语言源代码文件 |
.S | 经过预编译的汇编语言源代码文件 |
1.3常用选项
选项 | 含义描述 |
---|---|
-o filename | 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果filename没有指定,默认文件为 a.out |
-c | 只编译不链接,生成目标文件‘.o' |
-S | 只编译不汇编,生成汇编代码 |
-E | 只进行预编译,不做其他处理 |
-g | 在生成的可执行程序中包含标准调试信息 |
-v | 打印编译器内部编译各过程的命令行信息和编译器的版本号 |
-I dir | 在头文件的搜索策略路径列表中添加dir目录 |
-L dir | 在库文件的搜素策略路径列表中添加dir目录 |
-static | 链接静态库 |
-Dmacro | 定义指定的宏,使他能够通过源代码中的#ifdef进行检验 |
-O,-O2, -O3 | 将优化状态打开,该选项不能与-g选项联合使用 |
-Wall | 将warning 看作 error 对待 |
-Werror | 同上 |
-w | 禁止所有的报警 |
-pedantic | 严格要求符合ANSI标准 |
2.1安装和配置gcc
- 一般gcc机器内会直接默认安装gcc编译器的。
- 如果缺少常用的头文件和库文件可以使用 下列命令来联网下载
#sudo apt-get install bulid-essential
- /usr/include 这个目录及其子目录包含程序需要的头文件
- /usr/lib 大部分的编译程序会放在这个目录,这里有编译时需要的可执行程序,和一些特定的库文件与头文件等
2.2警告提示功能
-pdantic 选项 gcc在编译时若发现不符合ANSI/ISO C语言标准的源代码时,会出现警告 。虽然能帮助发现一部分,但并不是全部。事实上只有ANSI/ISO C语言标准要求诊断的地方才有可能被发现
-Wall/-Werror 会使发现的警告看作是错误
2.3优化gcc
代码优化是指编译器通过分析代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。
-O -O2 -O3 代表优化的3个级别,O3最高,级别越高,执行速度越快,但是相应的优化时间越长。
2.4链接库
Linux 下库文件分为动态链接库(通常以.so)结尾,和静态链接库(通常以.a结尾)
两者的差别在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。
默认情况下,gcc优先使用动态库,只有在动态库没有时才考虑静态库,也可以直接使用 -static 强制使用静态库。
2.5同时编译多个源程序
假定有fool1.c fool2.c fool3.c 3个文件进行编译,可以使用下面这条语句 #gcc fool1.c fool2.c fool3.c -o foo
但是上面这条指令相当于
#gcc -c fool1.c -o fool1.o
#gcc -c fool2.c -o fool2.o
#gcc -c fool3.c -o fool3.o
#gcc fool1.o fool2.o fool3.o -o foo
在仅有几个文件时,这种编译方法没有什么问题。
但是若有100文件时,当有一个需要更改,那么就要对100个文件都重新编译一次,很显然这样浪费的时间相当多。 为了解决这个问题, 我们可以借助make 这样的工具。--后面再说。
2.6调试选项