gcc & make

本文详细介绍了GCC编译器的常用选项及其在C编程中的应用,包括优化选项、连接选项等,并阐述了Makefile的使用方法,如何通过Makefile管理多个模块编译成一个可执行文件,实现自动化编译过程。


gcc


gcc [options] file-list
-ansi  在支持ANSI标准的c语法
-c     只生成目标文件(.o),不进行连接
-g     创建供调试程序gdb(GNU DeBugger, GNU调试器)使用的符号表,程序的剖析信息及调试信息
-llib 连接到lib指定的库文件
-mconfig  优化关于CPU的config代码
-o file  指定可执行文件名为file ,而不是默认的a.out
-O [level]  进行优化.0不进行优化,3优化级别最高
-pg   提供程序概要复习工具gprof所使用的剖析信息
-S    不对.c文件进行优化或连接,只保留生成的汇编文件,其名与源文件相同,拓展名为.s
-v    详细模式:使每个被调用的命令都在屏幕上显示.
-w    禁止警告
-W    给出额外的且更详细的警告
-Wall 使用它能够使GCC产生尽可能多的警告信息
-Werror,它要求GCC将所有的警告当成错误进行处理
-pedantic 选项,那么使用了扩展语法的地方将产生相应的警告信息



make

管理将多个模块编译成一个可执行文件。它读入一个名为makefile的规格文件,该文件描述了整个软件整个模块之间的相互依赖关系。make根据在makefile中定义的模块之间的依赖关系以及各模块的修改时间,使得重新编译的文件最少化。
-f    指定make从任意文件中读取依赖关系规范.如果没有此选项,则从当前目录中读取名为makefile或Makefile的文件.
-h    显示对所有选项的简单描述
-n    只显示而不实际运行任何makefile命令
-s    以"沉默"(silent)模式运行,不显示任何信息.

存在依赖关系的文件称为make规则.它的语法:
target-list: dependency-list
<Tab>  command-list
#注释行以#开始.
power:  power.o compute.o
        cc power.o compute.o -o power -lm
power.o: power.c
        cc -c power.c
compute.o: compute.c
        cc -c compute.c

make认为目标文件的名字就是源文件的名字,这种特性称为标准依赖。因此可以在依赖关系表中将与xxx.o对应的xxx.c删去。

makefile中支持简单的宏,以完成简单的文本替换。
Macro_name=text
make规则中并不一定是编译或连接命令,它们可以是任何合法的shell命令。
$cat makefile
CC = cc
OPTIONS = -X04 -0
OBJECTS = main.o input.o compute.o
SOURCES = main.c input.c compute.c
HEADERS = main.h input.h compute.h

power: main.c $(OBJECTS)
    $(CC) $(OPTIONS) power $(OBJECTS) -lm

main.o : main.c main.h input.h compute.h

input.o : input.c input.h

compute.o compute.c compute.h

all.tar: $(SOUTCES) $(HEADERS) makeifle
    tar cvf - $(SOURCES) $(HEADERS) makefile > all.tar

clean:
    rm *.o
$
在运行make命令时,最后两个目的文件(all.tar和clean)的命令将不会执行,因为这两个目的文件与任何文件没有任何依赖关系.




ar实用程序(库管理员)


ar key archive-name [file-list]
用于创建和处理归档文件.将file-list中的目标文件创建归档文件,保存在archive-file中.
d  从归档文件中删除一个文件
q  向已存在的某个归档文件中添加一个文件
r  创建一个新的归档文件,或者覆盖已存在的归档文件
t  显示一个归档文件的内容表
s  强制生成归档文件的符号表
x  从归档文件中抽取一个或多个文件,存放在当前目录下
v  产生详细的输出

$ ar r mathlib.a input.o compute.o
$ cc main.c mathlib.a -o power
$ ar q mathlib.a input.o compute.o
$ rm compute.o input.o
$ ar t mathib.a
$ ar d mathlib.a input.o
$ ar t mathlib.a
$ ar x stringlib.a cpstr.o

静态库文件需要使用“ar”来创建和维护。当给静态库增建一个成员时(加入一个.o文件到静态库中),“ar”可直接将需要增加的.o文件简单的追加到静态库的末尾。之后当我们使用这个库进行连接生成可执行文件时,链接程序“ld”却提示错误,这可能是:主程序使用了之前加入到库中的.o文件中定义的一个函数或者全局变量,但连接程序无法找到这个函数或者变量。
这个问题的原因是:之前我们将编译完成的.o文件直接加入到了库的末尾,却并没有更新库的有效符号表。连接程序进行连接时,在静态库的符号索引表中无法定位刚才加入的.o文件中定义的函数或者变量。这就需要在完成库成员追加以后让加入的所有.o文件中定义的函数(变量)有效,完成这个工作需要使用另外一个工具“ranlib”来对静态库的符号索引表进行更新。
如果我们使用GNU ar工具来维护、管理静态库,我们就不需要考虑这一步。GNU ar本身已经提供了在更新库的同时更新符号索引表的功能(这是默认行为,也可以通过命令行选项控制ar的具体行为。)。
ranlib [archive-list]
ar s [archive-list] 完成同样工作.

nm可以显示库和目标文件的符号表
nm key archive-name [file-list]
-n 在显示尾部符号之前先按名字排序
-p 生成可解析的输出,每个符号后面跟着它的值
-s 显示段落名,而不是索引
-v 在显示外部符号前先按值排序

 

 

 

版本控制(缺)  开发工具篇
admin  get sact delta prs rmdel comb sccs ci co rcs rlog rcsdiff rcsmerge

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值