嵌入式Linux开发工具5.16

gcc编译器

gdb调试器

make工程管理器

shell 脚本

 预处理:#include包含文件内容替换语句,定义的宏被展开, GCC预处理阶段可以生成.i的文件,通过选项-E可以使编译器在预处理结束时就停止编译:gcc -E -o hello.i hello.c

编译: 编译器对源码进行词法分析、语法分析、优化等操作,最后生成汇编代码。可以通过选项-S使GCC在进行完编译后停止,生成.s的汇编程序: gcc -S -o hello.o hello.c

汇编:这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,保存在后缀为.o的目标文件中。gcc -c -o hello.o hello.c

链接: 经过汇编以后的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,还必须与系统提供的启动代码链接起来才能正常运行,这些工作都是由链接器来完成的。

gcc 使用

gcc [options] [filenames]  options:编译器所需要的编译选项  filenames:要编译的文件名

-c:只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件

-o :output_filename:确定可执行文件的名称 为output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out。(只生成可执行文件,无关文件命名) :gcc hello.c -o hello.o  生成名为hello.o的可执行文件。

-g:产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。

-O: 对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

-O2:比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

-Idirename:  将dirname所指出的目录加入到程序头文件目录列表中

-Ldirename:  将dirname所指出的目录加入到库文件的目录列表中

-lname:  在连接时装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。 例如,-lm表示连接名为“libm.a”的数学函数库

-static:静态链接库文件

静态库:是在执行程序之前就已经加入到执行代码中,成为执行程序的一部分来执行的,后缀名:.a

动态库:是在执行程序启动时加载到执行代码中,后缀名:.so

静态库的创建:

创建:          gcc –c 源文件.c

 ar rcs 静态库名 目标文件1 目标文件2          

rc:静态库不存在,就创建该库文件        

 s:更新库文件   ar -t 静态库名  查看.o文件     

 ar -d 静态库名  *.o删除         ar -x 静态库名 *.o 提取

 静态库的使用: 静态库创建成功后,然后对全局变量和函数进行声明,在编译的时候加上库文件就行! gcc  -o file flie.c –L. -lname

 

动态库的创建:

gcc  -shared –fPIC –o 库名.so 源文件.c

 

动态库的使用:

gcc 源文件.c ./ 库名.so –o 可执行文件名

 

 gdb

程序调试工具

GDB主要完成下面三个方面的功能:

1、启动被调试程序。

2、让被调试的程序在指定的位置停住。

3、当程序被停住时,可以检查程序状态-变量值

GDB使用

编译生成可执行文件: gcc -g test.c -o test

2.启动GDB gdb test

 

list(l)  查看程序

 

break(b) 函数名: 在某函数入口处添加断点

break(b) 行号:在指定行添加断点

break(b) 行号 if 条件 当条件为真时,指定行号处断点生效,例b 5 if i=10,当i等于10时第5行断点生效

info break  查看所有设置的断点

delete 断点编号 删除断点

run(r)  开始运行程序

next(n)  单步运行程序(不进入子函数)

step(s)  单步运行程序(进入子函数)

continue(c) 继续运行程序(运行到下一个断点)

print(p) 变量名 查看指定变量值

finish  运行程序,直到当前函数结束

watch 变量名 对指定变量进行监控

quit(q)  退出gdb

 Make--工程管理器

是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作

makefile文件格式

target: dependency_files

<  TAB    >command /* 该行必须以tab键开头*/

 在Makefile 中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,第一条规则中的目标将被确立为最终的目标。

Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phonytargets)。

.PHONY : clean

        clean :     rm –f hello main.o func1.o func2.o

“.PHONY” 将“clean”目标声明为伪目标,如果目录中存在以clean命名的文件,此声明可进行区分

在makefile中,存在系统默认的自动化变量

$^:代表所有的依赖文件

$@:代表目标

$<:代表第一个依赖文件

例: hello: main.o func1.o func2.o     

        gcc main.o func1.o func2.o -o hello

=》 hello: main.o func1.o func2.o          

        gcc $^ -o $@

Makefile中“#”字符后的内容被视作注释。

hello: hello.c     

        @gcc hello.c –o hello

@:取消回显

Makefile中使用变量时用的是$(),如果变量名只是一个字符,则小括号可以省略。