二、gcc工具链。
工具名
|
作用
|
Ar
|
生成静态库
|
As
|
汇编器
|
Id
|
链接器,在链接过程中,由gcc调用链接 器ld.将用户编译生成的目标文件连同系统的glibc启动代码链接在一起,形成最终的可执行文件
|
Nm
|
查看目标文件中的符号
|
Objcopy
|
将原目标文件中的内容复制到新的目标文件中,可以通过不同的命令选项调整目标文件的格式,例如去除ELF文件头
|
Ranlib
|
为静态库文件创建索引,相当于arw命令的s选项
|
Readeld
|
解读ELF文件头
|
Size
|
列出目标文件每一个段的大小和总的大小
|
Sttings
|
列出目标文件中的字符串
|
Strip
|
去除目标文件中的所有符号,使目标文件尺寸减小
|
三、Makefile的应用。
1、makefile文件入门。
@ Makefile文件的组成内容:
显式规则:生成的文件,生成的文件的依赖文件事生成的命令
隐式规则:通过make工具的自动推导的功能。
变量的定义:这些变量一般都是字符串。
文件指示:通过用include.
注释:用#字符来进行转义。“/#”
@make工具的退出码。
0—表示成功。
1—表示makefile文件执行出现了错误。
3—表示如果用户使用了make 的-q选项,并且make使一些目标不需要更新,则
返回2。
2、书写makefile规则。
@使用基本规则。
Targets: prerequisites
Command
//注意这样来写的时候command前面要用tab键来开头。
或者
targets :prerequisites ; command
//用“:”来隔开。
@使用伪目标。
如:
clear :
Rm edit main.. Kd.o
只有通过显示地指明这个目标才能对其进行执行。为了避免和已存在的文件重
名,可以使用一个特殊的标记。PHONY来显示地指明一个目标是伪目标。
例如:
.PHONY :clean
这样不管你里面有没clean的文件,当你执行make clearn 都没有事。
伪目标也可以作为默认目标。此时其位置必须是第一个目标。
例如:
all : main.o kbd.o
.PHONY all
伪目标也可以作为依赖.(就像是子程序一样)
例如: .PHONY: cleanall cleanobj cleanmk
Clearnall : cleanobj cleandiff
Rm app
@使用通配符。
“*”、“?”、“【】”
@使用搜索源文件。
设置vpath变量如:vath=src:../include 表示在当前目录上srct和父目录下的
Include目录中。用“:”分隔。
使用vpath 关键字。
例如: vpath % .c /src //"%"为一个通配符。
3、使用命令。
@显示命令。
例如: @echo compling........
当make 时候就会显示命令。如 compling....
@执行命令。
例如:
在编辑makefile文件中如下:
all:
ls -l
./hello
.PHONY :all
执行makefile文件
make -s all
当前一个命令的结果为下一条命令使用时。用“;"隔开。如cd /home ; pwd
命令的出错。
当忽略命令出错造成的停止。在命令前用:和在tab后加减号"-"或
用.IGNORE声明作为目标的。如下
Clear:
-rm -f *.c
或者:clear:
rm -f *c
.IGNORE
4、使用变量。
@使用普通变量。
在使用变量是要注意在变量名前加“$”,$(VARNAME),在文中使用真实在$
时,要这样子来用$$.如使用这个$?时要变成$$?.
@变量中的变量。
(1)使用“=”操作,但是很容易造成递归。
foo = $(bar)
bar =$(ugh)
Ugh = Hhdfl?
all :
echo $(foo)
执行make -s all
(2)使用“:=”操作符。这个可以避免递归的危险。但是前面用到的用到
没有定义的变量,当为空。
(3)使用“?=”操作符。如果变量之前没有被定义过,那么变量的值就被
定义。反之,赋值语句什么也没有做。
@追加变量的值。
这主要是利用操作符“+=”。
@自动化变量。
自动化变量
|
表示的意义
|
$@
|
表示规则中的目标文件集
|
$%
|
$<
|
$?
|
$^
|
$+
|
$*
|
5、使用条件判断.
@条件表达式。
表达式的格式:
<conditional-directive> (这可以用4个关键字)
<text-if-true>
endif
或者
<conditional-directive> (这可以用4个关键字)
<text-if-true>
else
<text-if-false>
endif
关键字:(ifeq,ifneq,ifdef,ifndef)
(1)ifeq: ifeq(arg1,arg2).比较 arg1和arg2的值,相同为真。
(2)ifneq: 与上面相反。
(3)ifdef: ifdef(varible-name),如果值为不空,表达式为真。
(4)ifndef:与上面相反。
6、使用函数。
@函数调用的语法。
必须要以$开头,以圆括号或花括号把函数名各参数括起。参数可以为变量。用豆
例如:$bar :=$(subst $()space ,$(comma) ,$(var)) sub为函数。
@字符串处理函数。
(1)字符串替换函数。
表达式:$(subst <from>,<to>,<text>)把text中的from替为to.
如:$(result) = $(subst a, A ,how are you, china?)
输出为: how Are you,chinA?
(2)模式字符串替换函数。
表达式:$(pathsubst <pattern>, <replacement>,<text>)
函数功能:把text 中的单词有patten 改为replacement.
(3)去空格函数。
表达式: $(strp <string>)
去掉string字符串中开头和结尾的空格。返回去空格的字符串
(4)查找字符串函数。
表达式:$(fiindstring <find>,<in>)
功能:in the string of"in",find the string of string;
Return :fiind the the string of in the string of "in".
(5)过滤函数。
表达式:$(filter <pattern....>,<text>)
$(filter %.c %.h, a.c b.c c.c d.h e f)=a.c b.c c.c d.h.
(6)反过滤函数。
表达式:$(filter-out <pattern。。。> .<text>)
功能相反。
(7)排序函数。
表达式:$(sort<list>)
例子:$(sort hello world china)结果为: china hello world
(8)取单词函数。
Eg: $(word 2, hello world china)the result is : "world"
(9)取单词串函数
表达式:$(worldlist <s>,<e>,<text>)
In the sring of"text",geting the string from "s" to "e"
(10)单词个数统计
$(worlds hello world china)=3.
(11)首单词函数。
$(firstword hello world china)=hello
@文件名操作函数。
1、取目录函数。
$(dir text.c /home/admin/text.c)
The result is :
./ /home/admin
2、取文件函数
$(notdir test.c /home/admin.test.c) the resutl : test.c test.c
3取后缀函数。
$(suffix text.txt /home/admin/text.c file)the result is : .txt .c
4、取前缀
$(basename test.tex /home/admin/text.c file)=/home./admin
5、加后缀
$(addsuffix .c ,a b c)=a,c b.c c.c
6、加前缀
$(addprefix /home/adnin, tex.c)
7、连接函数
$(join /home/ /home/ ,text1.c text2.c test3.c)=/home/text1.c /home/text2.c test3.c
8、foreach函数
9、if函数。
$(if<condition> ,<then-part> ,<else-part>)
10、call函数
add = $(1) +$(2) #定义一个函数,求两个参数的和。
$(call add ,1,2)=3
11、origin 函数。
该函数可以将变量的定义信息返回给用户。
12、shell 函数
$(shell ls)