gcc & make


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值