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