嵌入式Linux系统下的开发工具
调试器 —gdb
gdb也是GUN计划 (a\启动运行程序 b\设置断点 c\查看变量值)
使用gdb之前:需用-g编译选项
学习gdb命令:gdb可执行文件 --tui
运行命令:run (r) contine ©
设置断点:break + 行号 break + 函数名 break +行号 +条件
查看断点信息 : info break
删除断点: delete +断点号
单步执行:next (不进入子函数) step (进入子函数)
查看变量值:print 变量名
gcc -g 01.c -o 01 gcc 01 (文件名为01) 输入gdb 01
出现(gdb)输入run 显示运行结果
输入list 持续回车 显示程序
使用break +行数 设置断点 d 1 消除断点
按q退出gdb
工程管理器 —make
1、什么是工程/项目(项目:多个源文件、资源文件构成的项目代码)
2、如何编译多个源文件的代码?(10000个源文件,并且不在同一个目录)----工程管理器 make
3、make作用:自动编译
4、makefile 文件的作用:存放编译项目的命令(如何‘编译这个项目的所有操作)
5、makefile是一个脚本文件:批处理命令
6、Makefile语法:三要素:目标、依赖、命令(执行命令,根据依赖的文件生成对应的目标)
makefile编写
格式
目标:依赖
tab 命令
执行顺序:make (可执行文件)目标名称(从目标名称下开始执行) 如果目标不存在就从下一行开始执行
制作加减乘除makefile文件
分别写出加减乘除余.c文件
vim add.c
#include "../main.h"
int add(int a,int b)
{
return a+b;
}
vim sub.c
#include "../main.h"
int sub(int a,int b)
{
return a-b;
}
vim mul.c
#include "../main.h"
int mul(int a,int b)
{
return a*b;
}
vim div.c
#include "../main.h"
int div(int a,int b)
{
return a/b;
}
vim mod.c
#include "../main.h"
int mod(int a,int b)
{
return a%b;
}
编写main文件
vim main.c
#include <stdio.h>
#include "../main.h"
int main()
{
printf("add=%d",add(6,3));
printf("sub=%d",sub(6,3));
printf("mul=%d",mul(6,3));
printf("div=%d",div(6,3));
printf("mod=%d",mod(6,3));
return 0;
}
vim main.h (工具作用)(函数申明放在一个文件形成一个库)
#define MAIN_H
#ifndef MAIN_H //和文件名对应
#include <stdio.h>
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);
int mod(int a,int b);
#endif
编写makefile
cal:main.o add.o sub.o mul.o div.o mod.o
gcc main.o add.o sub.o mul.o div.o mod.o -o cal
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
mul.o:mul.c
gcc -c mul.c
div.o:div.c
gcc -c div.c
mod.o:mod.c
gcc -c mod.c
.PHONY:clean #伪目标
clean:
rm -f cal *.o
使用make编译,得出
add = 9
sub = 3
mul = 18
div = 2
mod =0
企业级Makefile编写
企业级Makefile编写:
1、总控Makefile:进入各个功能子目录执行make命令,并将所有.o文件生成可执行文件
2、功能目录Makefile:将功能目录下的所有 .c文件编译成.o文件
3、脚本目录Makefile:定义其他Makefile文件所用到的变量
阅读Makefile顺序 3 - 1 - 2
1、$(wild card 模式参数)
eg: result: =
(
w
i
l
d
c
a
r
d
∗
.
c
)
(
∗
.
c
表
示
列
出
当
前
文
件
下
所
有
.
c
文
件
)
r
e
s
u
l
t
当
前
目
录
下
所
有
.
c
文
件
2
、
(wild card *.c)(*.c 表示列出当前文件下所有.c文件) result当前目录下所有.c文件 2、
(wildcard∗.c)(∗.c表示列出当前文件下所有.c文件)result当前目录下所有.c文件2、(patsubst 模式参数, 参数1, 参数2)
eg: result: $(patsubst %.c, %.o, x.c, y.c)
result: = x.o, y.o
3、 :=(防止出现死循环,不可以后面给前面赋值)
a1 := a.o
a2 := $(a1) b.o
a1 := a.o a2 :=a.o b.o
a1 := $(a2) b.o
a2 := a.o
a1 := b.o a2 := a.o
4、 += (给这个变量添加值)
a1 = a.o
a1 += b.o
a1 = a.o b.o
a1 = a.o
a1 :=$(a1) b.o
a1 = a.o b.o
5、$(addsuffix 参数1 , 参数2)(参数2中的每个单词都加上参数1的后缀)
result := $(addsuffix .c, x y)
result = x.c y.c
6、 foreach(循环)(ps:单词为变量)
$(foreach 变量参数, 参数1 , 表达式)
功能:循环取出参数1中的单词赋值给变量参数,然后运行表达式。返回值:表达式的结果
a := x y z
result :=
(
f
o
r
e
a
c
h
b
,
(foreach b,
(foreachb,(a), $(b).c)
result = x.c y.c z.c
7、
(
c
a
l
l
变
量
参
数
,
参
数
.
.
.
.
.
.
.
.
.
)
功
能
:
循
环
把
参
数
依
次
赋
值
给
变
量
参
数
中
的
(call 变量参数,参数.........) 功能:循环把参数依次赋值给变量参数中的
(call变量参数,参数.........)功能:循环把参数依次赋值给变量参数中的(1) 、
(
2
)
.
.
.
.
.
.
.
.
.
.
.
.
.
返
回
值
:
赋
值
后
变
量
的
值
a
:
=
(2).............返回值:赋值后变量的值 a :=
(2).............返回值:赋值后变量的值a:=(2) $(1)
result := $(call $(a),x y)
result = yx
tree命令下:
scripts 放 脚本文件
include 放 头文件
Modules 存储函数名的目录
企业级加减乘除余Makefile的编写
分别写出加减乘除余.c文件
vim add.c
#include "../main.h"
int add(int a,int b)
{
return a+b;
}
vim sub.c
#include "../main.h"
int sub(int a,int b)
{
return a-b;
}
vim mul.c
#include "../main.h"
int mul(int a,int b)
{
return a*b;
}
vim div.c
#include "../main.h"
int div(int a,int b)
{
return a/b;
}
vim mod.c
#include "../main.h"
int mod(int a,int b)
{
return a%b;
}
编写main文件
vim main.c
#include <stdio.h>
#include "../main.h"
int main()
{
printf("add=%d",add(6,3));
printf("sub=%d",sub(6,3));
printf("mul=%d",mul(6,3));
printf("div=%d",div(6,3));
printf("mod=%d",mod(6,3));
return 0;
}
vim main.h (工具作用)(函数申明放在一个文件形成一个库)
#define MAIN_H
#ifndef MAIN_H //和文件名对应
#include <stdio.h>
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);
int mod(int a,int b);
#endif
分别建文件夹 add sub mul div mod main将对应的.c文件放入
总控Makefile
include scripts/ Makefile
modules_make = $(MAKE) -C $(1);
modules_clean = $ (MAKE) clean -C $(1) ;
.PHONY :all mm mc clean
all: $(Target)
mm:
@ $(foreach n,$ (Modules) ,$(call modules_make,$(n)) )
mc:
@ $(foreach n,$ (Modules),$(call modules_clean,$(n)))
$ (Target) : mm
$(CC) $(CFLAGS) -o $(Target) $(Allobjs) $ (Libs )
@ echo $ (Target) make done!
clean : mc
rm -rf $ (Target)
@ echo clean done !
分别把子目录Makefile放进add sub mul div mod main 文件夹中
子目录下Makefile
include ../scripts/Makefile
all : $(objs)
clean :
rm -rf $(objs)
创建文件夹 scripts (脚本目录)
并在脚本目录下建Makefile
CC := gcc
CFLAGS := -Wall -03
Libs =-lpthread
Target := client
Source := $ (wildcard *.c)
objs := $(patsubst %.c,%.o,$ (Source) )
Modules += add sub mul div mod main
Allobjs := $(addsuffix /* .o,$ (Modules) )
最后,运行 make clean 运行 make 运行 ./client
add = 9
sub = 3
mul = 18
div = 2
mod =0