写点什么

【嵌入式实验】,面试官必问的技术问题之一

用户头像
极客good
关注
发布于: 刚刚

5.1 交叉编译工具配置及编译




步骤【参看 04- Tiny6410 Linux 开发指南.pdf 文档 1.3.5 节】:


也可以参考这篇笔记:Linux开发工具arm-linux-gcc安装及使用


第一步,解压缩交叉编译器工具命令为:tar xvzf arm-linux-gcc-4.6.4-v6-vfp-20101103.tgz -C/


arm-linux-gcc 可执行文件位于目录 /opt/FriendlyARM/toolchain/4.6.4/bin


第二步,修改 PATH 环境变量,将 arm-linux-gcc 可执行文件目录添加到 PATH 环境变量中,命令为Export PATH=/root/opt/FriendlyARM/toolschain/4.6.4/bin:$PATH


第三步,执行 arm-linux-gcc –v 可以看到交叉编译器版本为 gcc?version 4.6.4



5.2 arm-linux-gcc 编译工具使用




【参看相关视频文件及指导书】:


要求:要求编写冒泡排序程序 bubble.c 及其头文件 bubble.h 和主程序 main.c,各文件主要内容如下:


main.c 中定义数组并赋值(数组元素个数和赋值内容可以自己定义),调用 bubble.c 中冒泡排序函数 bubble(int *p,int n) 进行排序,调用输出打印函数 print(int *p,int n) 进行输出。


bubble.c 定义 bubble(int *p,int n) 和 print(int* p ,int n) 函数,分别完成冒泡排序功能和数组输出功能。


bubble.h 完成 bubble.c 中函数的声明。


第一步,在 /opt/exp_2 文件夹下按照上述要求编写源码;


第二步 编译


(1)编译源码文件为可执行文件 bubble,命令为:gcc?-o?bubble?main.c?bubble.c


(2)假设在 /opt/exp_2 文件夹下新建子目录 include,并将 bubble.h 移到该文件夹下,编译可执行文件 bubble,命令为:gcc?-o?bubble?main.c?bubble.c?-I./include


(3)假如将 bubble.c 编译成动态库 libbubble.so,具体命令为:arm-linux-gcc –shared -fpic -o libbubble.so bubble.c –I./include,此时利用 libbubble.so 编译可执行文件 bubble,具体命令为:gcc?-o?bubble?main.c?-lbubble?-L./?-l./include


思考:如果将 bubble 拷贝到开发板上,执行是否成功?怎样才能成功?


gcc 编译会失败;用 arm-linux-gcc 编译可以成功。


(4)可执行程序 bubble 生成过程中,分别使用 -O1/-O2/-O3 进行编译,生成的可执行文件名分别为 bublle1 、bubble2 和 bubble3,观察这几个文件的大小分别为 878487848784 字节。如果用-g 命令选项生成可执行文件 bubble4,则字节大小为10392字节。


思考:为何这几个可执行文件大小有差异


实验代码本身很简单,-o1、-o2、-o3 优化作用不大; -g 编译器在编译的时候会产生调试信息



5.3 编写 Makefile 和使用 make 工具




按照 5.2 要求,编写 Makefile 文件,要求能够完成源码文件编译和中间文件清除。


(1)Makefile 如下


SRCS:=$(wildcard *.c)


OBJS:=(SRCS))


CC=gcc


bubble:$(OBJS)


@ $(OBJS)


%.o:%.c


$(CC) -


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


g -c -o < -l./include


clean:


rm $(OBJS) bubble


(2)使用 make 工具编译生成可执行文件命令为 make;


(3)清除中间结果命令为 make clean


5.4 使用 gdb 调试应用程序




假设按照我们提供的实验源码 bubble.c 和 main.c 生成可执行文件,执行结果为:


the sorted Array is 32766 1 2 3 5 10 32766



发现执行结果并不符合我们的预期,使用 gdb 进行调试,列出具体步骤如下:


gdb bubble;


list bubble


list


b main


Run


List


next


print a[0]


next


Print a[0]


Print a[1]


Print a[3]


Print a[4]


Next


Quit


b print

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【嵌入式实验】,面试官必问的技术问题之一