2021-04-01

嵌入式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.cresult.c2(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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值