编译器 -gcc
*** 是一个交叉平台编译器 ,能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件
gcc基本用法 : gcc [options] [filenames]
-o output filename : 确定可执行文件的名称为 output filename
-c : 只编译不连接成为可执行文件
-g : 产生调试工具所必要的符号信息
-O -O2 对程序进行优化编译
-ldirname : 将dirname所指出的目录加入到程序头文件目录列表中
-lname : 在连接时装载名字为“ libname.a” 的库函数,该函数位于系统预设的目录或者由-L选项确定的目录下。
例子: -lm表示连接名为“libm.a"的数学函数库
-static : 静态链接库文件
静态库: 后缀名为 .a
动态库:后缀名为 .so
静态库的创建:
gcc -c 源文件.c
ar rcs 静态库名 目标文件1 目标文件2…
rc : 静态库不存在 ,就创建该库文件
s: 更新库文件
静态库的使用:
静态库创建成果后,然后对全局变量和函数进行声明,在编译时候加上库文件就ok
gcc -o file file.c -L -lname
动态库的创建:
gcc -shared -fPIC -o
库名.so 源文件.c
动态库的使用:
gcc 源文件.c ./库名.so -o 可执行文件名
-w :不生成任何警告信息
-Wall :生成所有警告信息
-DMACRO :定义MACRO宏,等效于在程序中使用#define MACRO
调试器 gdb
功能: 1.启动被调试程序
2.让被调试的程序在指定位置停住
3.当程序被停住时,可以检查程序状态 变量值
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 单步运行程序(进入子函数)
continue 继续运行程序
print 变量名 查看指定变量值
finish 运行程序,直到当前函数结束
watch 变量名 对指定变量进行监控
quit 退出gdb
***
工程管理器-make
指的是管理较多的文件Make工程管理器也就是个“
自动编译管理器”,“自动”指的是它能根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,通过读入Makefile 文件文件内容来执行大量编译工作
一个makefile通常包括如下内容:
需要由make 工具创建的目标体(
target),通常是目标文件或可执行;
要创建的目标体所依赖的;创建每个目标体时需要运行的命令(
command),这一行必须以***制表符***(
tab键)开头
makefile 格式:
target : dependency_fils
< tab >command
例如:
hello:hello.o
gcc -o hello hello.o
hello.o: hello.c
gcc -c hello.c
使用Makefile:
$ make
gcc -c hello.c -o hello
$ls
hello.c hello.h hello.o makefile
hello : main.o func1.o func2.o
gcc main.o func1.c func2.o -o hello
main.o :main.c
gcc -c main.c
func1.o : func1.c
gcc -c func2.c
.PHONY :clean
clean :
rm -f hello main.o func1.o func2.o
Makefile中只有一个最终目标 ,其他的目标都是这个目标所带出来的,使用一定要让make知道的最终是什么。第一条规则中目标最终被确立最终目标。
make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方式指定:
make -f 文件名
Makefile中巴那些没有任何依赖只有执行动作的目标称为伪目标
.PHONY :clean
clean:
rm -f hello main.o func1.o func2.o
".PHONY"将 “cleam"目标声明为伪目标
在makefile中存在系统默认的自动化变量
$^:代表所有依赖文件
$@:代表目标
$<:代表第一个依赖文件
例子:
hello: main.o func1.o func2.o
gcc main.o func1.o func2.o -o hellp
等价于
hello: main.o func1.o func2.o
gcc $^ -o $@
Makefile 中”#"字符后的内容被视为注释。
hello:hello.c
@gcc hello.c -o hello
@取消回显