嵌入式初学(二)嵌入式开发工具

学习内容及目标 :

1.嵌入式Linux开发工具-编辑器gcc(静态库和动态库的制作与使用)目标:库制作使用
2.嵌入式Linux开发工具-调试器gdb(调试方法)目标:调制内存错误
3.嵌入式Linux开发工具-工程管理器make 目标:企业级makefile编写、cmake
注项目布置:嵌入式Linux开发工具:CMake
嵌入式Linux开发工具:git版本管理器.
g++:c++编译器
嵌入式Linux开发工具:shell编程

嵌入式Linux开发工具-编辑器gcc

1.交叉编译器(什么是交叉编译?为什么需要交叉编译?安装交叉编译器)
交叉编译:在当前CPU平台编译出其他CPU平台运行过程(安装交叉编译器),电脑处理器为X86处理器,移动端处理芯片为ARM处理器。
为什么要安装交叉编译器:不同处理器汇编语言不同。

一个源文件到可执行文件需要那几个步骤?
预处理-编译-汇编-链接;(hello.c).
每个步骤具体完成哪些工作?
1)预处理:头文件展开、宏替换、条件编译
gcc -E hello.c > hello.i

:重定向;将hello.c预处理到hello.i
头文件存放目录:/vim/user/include/
条件编译:#if 0————#endif (大段注释)
特点:不检查语法错误
2)编译:检查语法、生成汇编文件
gcc -S hello.c > hello.s
3)汇编:将汇编文件编译生成目标文件
gcc -c hello.c
4)链接:将所有目标文件的符号(函数名、变量名)建立符号表
gcc -o hello

2.编译选项
-E hello.c > hello.i:(>:重定向;)将hello.c预处理到hello.i
-S:生成汇编语言文件
-c:将汇编文件生成可执行文件
-l:连接到所需头文件;-Itest(名):第三方头文件目录检索
-L:指定到绝对路径;把新目录添加到库搜索路径上。例如,-L/opt/gdbm-1.8.3/lib。
-O(0/1/2/3):零一二三级优化,
-Wall:提示所有警告
-D:定义宏, -DMAX(宏定义名称):恢复注释了的MAX宏定义
-static:在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上 无效。

3.库文件:存放函数和变量的仓库;特点:只能使用库里的函数和变量,不能看 到其实现。
4.inux库文件
静态库.a:当使用静态库时,库里的函数和变量是在编译时加载到可执行文件的;
gcc hello.c(printf)
动态库.so:当使用动态库时,库里的函数和变量是在运行时加载到可执行文件的;
./a.out(printf)
使用静态库和动态库的区别:
1)可执行文件的大小:静态库>动态库–> (内存的使用效率);
2)可执行文件执行速度:静态库>动态库–>(运行效率)
3)可执行文件功能的升级:静态库<动态库–>(功能升级的难易程度)
4)可执行文件代码部署:静态库>动态库–>(代码位置的部署)
5.库文件的存放路径:/lib:系统所需用的库
/usr/lib:存放第三方软件及工具的库
6.库的制作
静态库
gcc -c 源文件
ar rcs 库文件名 目标文件
gcc 源文件 -l库名 -L库的路径
编写.c和.h头文件:vim add.h vim sub.h vim add.c vim sub.c
将.c制作成.o:gcc -c add.c
gcc -c sub.c
将.o文件制成库:ar rcs libcal.a add.o sub.o
编译:gcc main.c -lcal -L./(./表示当前文件夹)
动态库
gcc-shared-fPIC 源文件 -o 库名
gcc 源文件./库名 -o 可执行文件
1)gcc -shared -fPIC add.c sub.c -o libcal.so
2)gcc main.c ./libcal.so -o main -L.
运行时错误(cored jumped)
出错行之前仍能运行:在每行下加printf(“A…”)查找问题行;
debug.h(需注释第一行,不然包含debug.h头文件后,宏定义条件始终满足)

  2 #ifndef __DEBUG__                                                          
  3 #define debug_msg(fmt, args...)                                             
  4 #else                                                                       
  5 #define debug_msg(fmt, args...) printf(fmt, ##args)                         
  6 #endif        

嵌入式Linux开发工具-调试器gdb

1.gdb也是GNU计划(a\启动运行程序;b\设置断点;c\查看变量)
2.使用gdb调试前:需用-g编译选项生成调试文件
gcc -g demo.c -o demo
3.学习gbd命令:gdb 可执行文件 --tui
基础命令:
1)运行程序; run(r)
continue(c):继续执行直到停止或遇到下一个断点
2)设置断点: break +(行号)停止在行号处;
break+(函数名)停止在函数运行
break+行号+条件
3)查看断点信息;info break
4) 删除断点:delete+断点编号
5) 刷新:代码乱码一般可采用退出重进,如果对源程序熟悉就不要进可视化界 面。 layout src:源码,layout.asm: 汇编

6)单步执行:next(n)特点:不会进入子函数
step(s)特点:进入子函数
7)查看变量值:print+变量名
8)查看源码:list
9)退出:q

嵌入式Linux开发工具-工程管理器make

1、什么是工程?(项目:多个源文件及头文件、资源文件构成的项目代码)
2、如何编译多个源文件的代码?(10000个源文件,并且不再同一目录)-工程管理器make
3、作用:自动编译(根据makefile里规定的编译过程进行编译,同时通过时间戳判断文件是否发生变化,需要编译 )
4、makefile文件的作用:存放编译项目的命令(如何编译这个项目所有的操作)
5、makefile是一个脚本文件/语言:批处理
6、makefile语法:三要素:目标、依赖、命令(执行命令,根据依赖的文件生成对应目标)
格式:
目标:依赖
tab 命令
执行顺序:make目标名称(从目标名称下开始执行),如果没有目标就从第一行开始执行
伪目标:make+伪目标,执行伪目标语句
目标:hello,hello.o;伪目标: clean,install。

  1 hello:hello.o
  2         gcc hello.o -o hello
  3 hello.o:hello.c
  4         gcc -c hello.c -o hello.o
  5 .PHONY:clean install
  6 clean:
  7         rm -f hello hello.o
  8 install:
  9         mv hello /bin                                                       
 10 

测试1.使用makefile制作一个计算器
使用makefile将main.c add.c sub.c div.c mul.c 生成.o文件,通过链接到可执行文件cal中
有多个makefile文件时用-f来指定:make -f makefile文件名

  1 cal:main.o add.o sub.o div.o mul.o                                           
  2         gcc main.o add.o sub.o div.o mul.o -o cal
  3 main.o:main.c                                                                 
  4         gcc -c main.c
  5 add.o:add.c                                                                   
  6         gcc -c add.c
  7 div.o:div.c                                                                   
  8         gcc -c div.c
  9 mul.o:mul.c                                                                  
 10         gcc -c mul.c
 11 sub.o:sub.c                                                                  
 12         gcc -c sub.c
 13 .PHONY:clean                                                                 
 14 clean:
 15         rm -f cal *.o                                                       ~                                                                               
                                       

定义变量
例:obj:=/bgj+=
替换变量
例:cal:$(obj)
企业级makefile编写:
1.总控makefile:进入各个功能子目录执行make命令,并将所有的.o文件链接生成调试文件;
2.功能目录下makefile:将功能目录下的所有.c文件生成 src/.o文件;
3.脚本目录下makefile:定义其他makefile所用到的变量。
阅读makefile顺序:3-1-2

Makefile程序解读:
3.脚本目录下makefile,定义变量
理解:1)Target替换变量名client
2)wildcard列出绝对路径下所有符合模式参数的文件名,类似于查找。 Source为当前绝对路径src/下所有.c文件,例如src/a.c src/b.c
3)patsubset 模式参数 ,参数1 ,参数2,类似于替换作用,将参数2中符合模式参数的字符,用参数1替换,返回值为更改后的参数2。这里将Source中找到的绝对路径下的文件从.c替换成.o,更换文件后缀名。例如src/a.o src/b.o
4)addsuffix 参数1,参数2。为参数2的每个单词加上参数1后缀,Modules为功能目录名称
5)Allobjs为输出路径为每个功能目录的/src/*.o

在这里插入图片描述
1.总控makefile
理解:
根据Makefile语法,all输出为可执行文件cilent
确定语句先从mm开始运行;先foreach将 ( M o d u l e s ) 替 代 的 功 能 目 录 名 赋 给 n , 执 行 表 达 式 ; 表 达 式 c a l l 将 n 的 值 赋 给 m o d u l e s , 进 行 总 控 M a k e f i l e 对 功 能 目 录 的 嵌 套 执 行 。 m m 依 赖 条 件 完 成 , 执 行 (Modules)替代的功能目录名赋给n,执行表达式;表达式call将n的值赋给modules,进行总控Makefile对功能目录的嵌套执行。 mm依赖条件完成,执行 (Modules)ncallnmodulesMakefilemm(Target)的命令:gcc(编译) -Wall(显示警告) -O3(优化)-o(生成新的可执行文件) ( T a r g e t ) ( 新 生 成 的 文 件 名 为 c i l e n t ) (Target)(新生成的文件名为cilent) Targetcilent(Allobjs)(链接完成编译的功能目录生成的.o文件)
注:make clean按上述进行理解

在这里插入图片描述

.功能目录下makefile
理解:
确定生成的可执行文件的依赖条件,有已更换文件后缀为.o的文件生成。
在这里插入图片描述
为什么要在Linux环境下进行编程
Linux之前都是命令行操作系统(后来又图形界面),有大量的开源数据库,系统本省占用的资源极少,开发一些程序会比较方便。

完成cal使用工程管理器make编辑
更改Makefile中wildcard列文件时的绝对路径为当前文件夹
将Allobjs中路径改为当前文件
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值