嵌入式开发工具:
1.编译器GCC(查语法错误)
2.调试器GDB(查功能错误)
3.工程管理器:make
4.脚本shell(脚本文件不用编译可直接执行)
工程文件:进行多文件操作。
源文件.c——预处理.i——编译.o——链接——可执行.exe/.out
执行c语言的过程就是执行主函数的过程。函数 用来封装对应的功能
gcc的基本用法:
gcc [编译器所需要的编译选项 ] [文件名
-wall :打开所有的警告项
-O:设置优化级别
-g:加入可调式工具
-c:只编译,生成.o为后缀的目标文件(自动生成)
-o:用来指出输出文件的名字
-E:预处理(不生成任何输出文件) gcc -E hello.c -o hello.i
-D xxxx:定义了xxxx宏,相当于定义了#define
-U xxxx:取消了xxxx宏定义
-I xxxx:将xxxx所指出的目录加入到程序头文件目录列表中(不影响以前的目录)
-L xxxx: 将xxxx所指出的目录加入到库文件的目录列表中
-s :产生汇编代码
-C :不删除注释信息编译
-lname:在连接时装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由
-L选项确定的目录下
例如,-lm表示连接名为“libm.a”的数学函数库.
-static:静态链接库文件
程序库:包含了一些通用函数的数据和二进制可执行机器码的文件,其单独不能够运行。(目标文件)
静态库:是在执行程序之前就已经加入到执行代码中,成为执行程序的一部分来执行的,后缀名:.a
动态库:是在执行程序启动时加载到执行代码中,后缀名:.so
静态库的创建:
创建: gcc –c 源文件.c
ar rcs 静态库名 目标文件1 目标文件2
rc:静态库不存在,就创建该库文件
s:更新库文件
静态库的使用: 静态库创建成功后,然后对全局变量和函数进行声明,在编译的时候加上库文件就行!
gcc -o file flie.c –L. -lname
ar -t libcalculate.a 查看静态库
-d libcalculate.a add.o 把add.o文件删掉
-dv 删除提示 -xv 提取出库文件
动态库的创建:
gcc -shared -fPIC -o 库名.so 源文件.c
动态库的使用:
gcc 源文件.c ./库名.so -o 可执行文件名
调试器 GDB:
GDB主要完成三个功能:
1.启动被调试程序。
2.让被调试的程序在指定的位置停住。
3.当程序被停住时,可以检查功能。
步骤:1.编译生成可执行文件:$gcc -g tst.c -o tst
2.启动GDB:
g
d
b
t
s
t
3.
设
置
断
点
:
b
r
e
a
k
(
b
)
4.
运
行
:
r
u
n
(
r
)
5.
单
步
运
行
:
n
e
x
t
或
回
车
(
不
进
入
子
函
数
)
6.
继
续
运
行
:
c
o
n
t
i
n
u
e
(
c
)
单
步
运
行
s
t
e
p
(
s
)
(
进
入
子
函
数
)
i
n
f
o
b
r
e
a
k
查
看
断
点
d
e
l
a
t
e
断
点
编
号
删
除
断
点
d
e
l
a
t
e
+
断
点
号
d
i
s
a
b
l
e
b
r
e
a
k
断
点
失
效
i
n
a
b
l
e
b
r
e
a
k
断
点
生
效
f
i
n
i
s
h
运
行
程
序
,
直
到
当
前
函
数
结
束
q
退
出
G
D
B
模
式
l
i
s
t
(
l
)
查
看
程
序
(
只
显
示
10
行
)
c
l
e
a
r
删
除
所
有
断
点
d
i
s
p
l
a
y
+
表
达
式
:
显
示
表
达
式
的
结
果
p
r
i
n
t
(
p
)
变
量
名
显
示
指
定
变
量
的
值
w
a
t
c
h
+
变
量
名
对
指
定
变
量
进
行
监
控
(
b
5
i
f
I
=
10
)
当
I
=
10
时
,
第
五
行
短
点
生
效
m
a
k
e
工
程
管
理
器
(
m
a
k
e
f
i
l
e
是
m
a
k
e
读
入
的
唯
一
配
置
文
件
)
编
写
规
则
:
a
.
需
要
由
m
a
k
e
工
具
创
建
的
目
标
体
(
t
a
r
g
e
t
)
,
通
常
是
目
标
文
件
或
可
执
行
文
件
。
(
第
一
个
t
a
r
g
e
t
为
终
极
目
标
,
有
且
只
有
一
个
)
b
.
要
创
建
目
标
体
所
依
赖
的
文
件
,
创
建
每
个
目
标
体
时
需
要
运
行
的
命
令
(
c
o
m
m
a
n
d
)
,
这
一
行
必
须
以
制
表
符
t
a
b
键
开
头
。
例
:
!
[
在
这
里
插
入
图
片
描
述
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
20181113151841829.
p
n
g
?
x
−
o
s
s
−
p
r
o
c
e
s
s
=
i
m
a
g
e
/
w
a
t
e
r
m
a
r
k
,
t
y
p
e
Z
m
F
u
Z
3
p
o
Z
W
5
n
a
G
V
p
d
G
k
,
s
h
a
d
o
w
1
0
,
t
e
x
t
a
H
R
0
c
H
M
6
L
y
9
i
b
G
9
n
L
m
N
z
Z
G
4
u
b
m
V
0
L
1
B
v
b
G
x
v
d
18
=
,
s
i
z
e
1
6
,
c
o
l
o
r
F
F
F
F
F
F
,
t
7
0
)
格
式
:
t
a
r
g
e
t
:
d
e
p
e
n
d
e
n
c
y
f
i
l
e
s
<
T
a
b
>
c
o
m
m
a
n
d
/
∗
该
行
必
须
以
t
a
b
键
开
头
∗
/
使
用
M
a
k
e
f
i
l
e
:
gdb tst 3.设置断点: break (b) 4.运行:run (r) 5.单步运行:next或回车(不进入子函数) 6.继续运行:continue(c) 单步运行 step(s)(进入子函数) info break 查看断点 delate 断点编号删除断点 delate+断点号 disable break 断点失效 inable break 断点生效 finish 运行程序,直到当前函数结束 q 退出GDB模式 list(l)查看程序(只显示10行) clear 删除所有断点 display +表达式:显示表达式的结果 print(p)变量名 显示指定变量的值 watch +变量名 对指定变量进行监控 (b 5 if I=10)当I=10时,第五行短点生效 make 工程管理器 (makefile是make读入的唯一配置文件) 编写规则: a. 需要由make工具创建的目标体(target),通常是目标文件或可执行文件。(第一个target为终极目标,有且只有一个) b.要创建目标体所依赖的文件,创建每个目标体时需要运行的命令(command),这一行必须以制表符tab键开头。 例: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181113151841829.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BvbGxvd18=,size_16,color_FFFFFF,t_70) 格式: target:dependency_files <Tab> command /*该行必须以tab键开头*/ 使用Makefile:
gdbtst3.设置断点:break(b)4.运行:run(r)5.单步运行:next或回车(不进入子函数)6.继续运行:continue(c)单步运行step(s)(进入子函数)infobreak查看断点delate断点编号删除断点delate+断点号disablebreak断点失效inablebreak断点生效finish运行程序,直到当前函数结束q退出GDB模式list(l)查看程序(只显示10行)clear删除所有断点display+表达式:显示表达式的结果print(p)变量名显示指定变量的值watch+变量名对指定变量进行监控(b5ifI=10)当I=10时,第五行短点生效make工程管理器(makefile是make读入的唯一配置文件)编写规则:a.需要由make工具创建的目标体(target),通常是目标文件或可执行文件。(第一个target为终极目标,有且只有一个)b.要创建目标体所依赖的文件,创建每个目标体时需要运行的命令(command),这一行必须以制表符tab键开头。例:![在这里插入图片描述](https://img−blog.csdnimg.cn/20181113151841829.png?x−oss−process=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BvbGxvd18=,size16,colorFFFFFF,t70)格式:target:dependencyfiles<Tab>command/∗该行必须以tab键开头∗/使用Makefile: make
gcc -c hello.c -o helllo.o
$ ls
hello.c hello.h hello.o makeflie
伪目标特点:不是任何目标的依赖,自身没有依赖
作用:执行某一个命令 执行伪目标:make
.PHONY:clean 声明clean是伪目标
在Makefile中存在系统的默认变量:
$^:代表所有的目标文件
$@:代表目标
$<:代表第一个目标文件
@:取消回显。加到命令的前面
#:注释
脚本:-shell 命令行解释器:遵循一定的语法将输入的命令加以解释并传给系统。用户可以用shell来启动、挂起、停止甚至是编写一些程序。
本质上,shell script 是命令行命令简单的组合到一个文件里面。
程序基础:
1.必须以 #!/bin/sh 放在文件的第一行
2.chmod +x filename
3.输入 ./filename 来执行脚本
注意:
shell变异中所有的变量都由字符串组成并不需要声明
去变量值时要在前面加$符号
变量赋值时“=”两边不能有空格
BASH语句结尾不需要分号
回显echo $a
shell默认变量:
$# :传入脚本的命令行参数个数
$* :所有命令行参数值在各个参数值间留有空格
$ 0:命令本身
$ 1:第一个命令行参数
$ 2:第二个命令行参数
相同(-eq)不同(-ne) 大于(-gt) 小于(-lt) 大于或小于(-ge) 小于或等于(-le) 为空(-z) 不为空(-n)
循环:while 当型循环
until 直到型循环
case 用于进行多项分支控制