在Ubuntu下安装imx6linux系统的交叉编译环境遇到的问题总结
这段时间一直忙于手上的嵌入式项目,可以说自己从嵌入式的菜鸟一点点的入门了,关于嵌入式和imx6核心板的开发有了一点的了解,尤其是对于板子环境的搭建。硬件的开发,搭建环境,是一个很大的工程量,也是很重要的一步,环境没有搭好就无法进行下一步。当然这个前提是对项目所使用的硬件有一定的了解。对于嵌入式开发,项目进行到现在,从一个什么都不懂的到现在可以和大家讨论v4l2,framebuffer,讨论linux的视频开发,虽然还是菜鸟级别的,但这个月确实让自己掌握了一们知识。
关于嵌入式的开发,网上有很多的教程和步骤,大概就是按照以下的步骤:确定需求、根据需求硬件选型、确定硬件并对硬件熟悉,搭建开发环境,软件部分,联机调试,各硬件间的联调,最后形成原型,裁剪系统,分装。这里的每一步都很重要,不能轻忽任何一步。下面总结了在搭建开发环境这块遇到的一些问题。不同的硬件有不同的要求,交叉编译的环境也不一样。
在Linux下搭建开发环境,你必须对linux系统的环境配置要有所了解。
一、环境配置
1.1、什么是shell
Shell:又名壳层,是“提供用户使用界面”的软件,通常指的是命令行界面的解析器,在操作系统中,提供访问内核所提供的服务的程序。
Shell:因为来自于操作系统(内核)与用户界面的外层界面,通常将壳层分为两类:命令行与图形界面。 命令行壳层提供一个命令行界面(CLI); 而图形壳层提供一个图形用户界面(GUI)。
bash 就是一个内置的shell程序,隶属于命令行壳层。简单的说,shell提供了一个接口,让用户输入命令,接收用户命令,然后调用相应的应用程序,就相当于dos的command。
1.2 环境的建立
用户登录系统后,会启动内置的bash程序,来读取启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。 针对不通的用户需求,会对操作系统的环境变 量进行修该,以满足用户需求,bash在读取系统默 认的环境便变量后,会自动读存储在主目录下用于定义个人环境的启动文件,建立所需的环境。
1.3 启动文件中有什么
shell会话分两种:login shell 和 non-login shell 会话。
login shell 的启动文件:
/etc/profile :适用于所有用户的全局配置脚本
~./bash_profile :个人启动文件,可扩展成全局配置脚本
~/.bash_login :
~/.profile
non-login shell:读取的启动文件
/etc/bash.bashrc :适用于所有用户的全局配置脚本
~/.bashrc :用户的个人启动文件,而后集成父类进程环境。其中父类进程通常是一个login shell。
eg : .bash_profile: # .bash_profile # cget the aliases and functions if [ -f ~/.bashrc ] ; then . ~/.bashrc fi # user specific enviroment and startup programs PATH = $PATH:$HOME / bin export PATH
# 开始的行是注释行,shell不会读取; 此段代码被称为 if 的复合命令
If the file “~/.bashrc ” exists , then read the "~/.bashrc" file
PATH=$PATH:$HOME / bin : 将$HOME / bin添加到了PATH值的尾部。
export 命令告诉shell,将shell的子进程使用PATH变量的内容。
1.4 修改环境
以上是系统启动文件的位置和内容,可以通过修改系统启动文件,来自定义个体环境。 环境变量的修改或者增加PATH目录,需要在 .bash_profile 文件中操作,根据版本的不同而不同,比如Ubuntu使用的就是./profile文件。 其他的修改应该在 .bashrc 文件中 修改工具:vim
文本编辑器分成两类:图形界面的和基于文本的 Ubuntu下常用的是基于文本的vim
联网安装:sudo apt-get vim
卸 载:rm -Rf vim
打开文件:vim 文件名 (一定要进入当前路径)
修改文件: a -->进入insert模式
退出文件:Esc + :+ (w,q, wq , q! ,wq! 等)
printenv : 打印部分或全部的环境信息
set : 设置shell选项
export : 将环境导出到随后要运行的程序中
alias : 为命令创建一个别名
source:文件路径/文件名
二、交叉编译
嵌入式系统开发过程中,运行程序的目标平台通常 具有有限的存储空间和运算能力,比如常见的ARM 平台: 静态存储空间:16~32MB, CPU的主频:100MHz~500MHz 因此,在ARM平台上不可能进行本机编译,因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。 我们就可以在CPU能力很强、存储控件足够的主机平台 上(比如PC上)编译出针对其他平台的可执行程序。PC机 资源丰富,可以很方便地集成开发环境和调试工具。
由于PC机与嵌入式系统环境的体系结构不同, 在PC机上可以运行的程序在目标机arm板上无法运 行,因此嵌入式开发必须采用交叉编译,以使PC机 可以生成在arm班上可以执行的代码。 编译的最主要的工作就是将程序转化成运行该程序的CPU所能识别的机器代码。此时就用到了交叉编译链。 要进行交叉编译,需要在主机平台上安装交叉编译工具链,然后用这个交叉编译工具链编译我们的源代码,最终生成可以在目标平台上运行的代码。
什么是编译工具链: 编译工具链可简单理解为编译工具集: 编译器,汇编器,链接器,C标准库。 编译器负责将源代码转换为二进制机器码(或汇编代码),像gcc; 汇编器和链接器等则负责可执行文件的构建,像 binutils,中文为二进制工具集; C标准库是通用的机器码库,供链接器用,像 glibc。
大致流程:
安装LTIB并编译BSP
- 编译Qt 4.8.5
- 安装Qt 4.8.5
- 并配置ARM的交叉编译
- ARM的交叉编译
三、问题总结
关于环境配置时遇到的一些问题总结或者是知识梳理:
3.1、make命令简介
在开发一个系统时,一般是将一个系统分成几个模块, 这样做提高了系统的可维护性,但由于各个模块间不可避免 存在关联,所以当一个模块改动后,其他模块也许会有所更 。为此,在Linux系统中,专门提供了一个make命令来自动维护目标文件。
优点:只更新修改过的文件(在Linux中,一个文件被创建或更新后有一个最后修改时间,make命令就是通过这个最后修改时间来判断此文件是否被修改),而对没修改的文 件则置之不理,并且make命令不会漏掉一个需要更新的文件。
依赖关系的确定: make命令当然不会自己知道这些依赖关系,需要程序 员将这些依赖关系写入一个叫Makefile的文件中。 Makefile文件中包含着一些目标,通常目标就是文件名, 对每一个目标,提供了实现这个目标的一组命令以及和这个 目标有依赖关系的其他目标或文件名。
3.2、找不到zlib
下面是涉及到的一点工具。
LTIB(Linux Target Image Builder)工程是一个使用在不 同的目标平台下,用于开发和部署BSP(Board Support Packages)的简单工具。使用该工具,用户能够为其目标平 台开发符合GNU/Linux标准的映像。
BSP(Board Support Package)是板级支持包,是介于主 板硬件和操作系统之间的一层,应该说是属于操作系统的一 部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。
问题描述:
运行./ltib –m config 就出错了
提示没安装zlib,其实系统已经安装了,也已是最新版本。
解决方法:
Zlib是提供数据压缩用的函式库, 对自己的程序和文件进行程序内数据压缩、解压
添加路径,打开目录/ltib/bin/Ltibutils.pm 文件,search for zlib部分代码;
zlib => sub { my @f = (glob('/usr/lib/libz.so*'),
glob('/lib/libz.so*'),
glob('/lib64/libz.so*'),+
glob('/lib/i386-linux-gnu/libz.so*'),
glob('/usr/lib/i386-linux-gnu/libz.so*'),
glob('/usr/lib32/libz.so*'),
glob('/usr/lib/x86_64-linux-gnu/libz.so*') ); @f > 1 ? 1 : 0 },
glob() 函数返回匹配指定模式的文件名或目录。
加粗那一行错误所在,添加进去后才可以运行。
3.3、./ltib错误
问题描述:
You don't have a working TeX binary installed, but the texi2dvi script
can't proceed without it. If you want to use this script, you have to
install some kind of TeX, for example TeX Live Debian packages. You can do
that with this command:
apt-get install texlive
make[2]: *** [flex.pdf] Error 1
make[2]: Leaving directory `/opt/freescale/ltib/usr/src/rpm/BUILD/flex-2.5.37/doc'
make[1]: *** [install-recursive] Error 1
make[1]: Leaving directory `/opt/freescale/ltib/usr/src/rpm/BUILD/flex-2.5.37'
make: *** [install] Error 2
error: Bad exit status from /home/cody/i.mx6/ltib/tmp/rpm-tmp.99407 (%install)
RPM build errors:
Bad exit status from /home/cody/i.mx6/ltib/tmp/rpm-tmp.99407 (%install)
Build time for flex: 27 seconds
Failed building flex
Died at ./ltib line 1392.
traceback:
main::build_host_rpms:1392
main::host_checks:1447
main:554
解决方案:
sudo apt-get install texinfo
sudo apt-get install texlive
原因:
tex 是一个排版系统
texlive就是包含了编辑器、编译器、阅读器的一个tex套装;
texinfo软件依赖于bash,包含读取、写入和转换 Info 文档的程序,以提供系统文档
3.4、找不到文件目录
问题描述:
bash:command not found
因为PATH变量的设置,导致系统原有的默认路径被覆盖,此时 sudo ,ls ,chmod等命令都不能用。
解决方案:
1,/usr/bin/sudo vi /etc/profile (由于你找不到sudo,所以必须写全路径,其他命令如果提示找不到,也需要写全路径)
2.末尾添加以下内容后保存
export PATH=$PATH:/sbin:/usr/bin:/usr/sbin
/sbin一般是指超级用户指令,主要放置一些系统管理的必备程式;
/usr/bin 是你在后期安装的一些软件的运行脚本;
/usr/sbin 放置一些用户安装的系统管理的必备程式;
要考虑root 的$PATH里是否已经包含了这些环境变量。
可以查看PATH,如果是:PATH=$PATH:$HOME/bin则需要添加成如下:
PATH=$PATH:$HOME/bin:/sbin:/usr/bin:/usr/sbin
3.重新启动系统或执行以下命令生效
source /etc/profile
以上感谢小妍是师妹的整理和分享,这让我们大家又多学了一点东西。以后决定将周会的内容记录下来,分享和总结。