目录
背景开发环境的搭建1.交叉编译工具的安装2.开发工具和依赖库的安装2.1. 必需部分2.2.可选部分ubuntu20.04.1 64位配置和编译Linux3.0内核背景
市面上的嵌入式linux开发板厂商提供给客户的开发环境往往是低版本的ubuntu,因为他们没有精力去测试每个版本的ubuntu,一旦某个版本调通了,这个版本就用一直用下去,不会换新的,这主要是考虑到人力成本。
理论上,高版本的ubuntu也是可以搭建好嵌入式linux开发环境的,只不过相比低版本的ubuntu,可能会做更多一些的工作,但总的来说也没有多少内容。
选择高版本的ubuntu的好处是什么呢?答案是,可以更好地支持其他软件或库,比如高版本的opencv就需要高版本的ubuntu才能支持。
开发环境的搭建
搭建嵌入式linux开发环境,主要包含两部分内容:
交叉编译工具的安装。开发工具和依赖库的安装,包括必需的和可选的。
这里先说下我的linux源码和交叉编译工具的来源:这两个都是由迅为开发板厂商提供,交叉编译工具包是arm-q3.tar.bz2
,linux内核版本为3.0。
我的ubuntu20.04.1 64位是运行在 vmware workstation pro 15 上的虚拟机。
1.交叉编译工具的安装
本质上就是把交叉编译工具解压到某个目录下,然后在PATH环境变量中添加此目录下的bin目录,以便其他应用程序找到交叉编译工具的可执行文件,最后修改linux源码根目录的Makefile里的CROSS_COMPILE
变量,用于指定编译内核的编译器。由于交叉编译工具属于系统开发级的东西,所以把它放在Home下显得不太合适。一般我们可以考虑把它放在/usr/local下,我们在/usr/local下建立一个arm文件夹,表示这是用于arm的交叉编译工具,然后将arm-q3.tar.bz2
拷贝到/usr/local/arm下解压即可。解压命令为:
tar xvf arm-q3.tar.bz2
接下来就是把交叉编译工具路径添加到PATH环境变量中。为了让每次系统重启后,PATH环境变量仍然能够包含我们的路径,PATH环境变量的添加应放在linux自启动脚本中进行。自启动脚本有好几个:有用户级的,也有系统级的,我一般喜欢用/etc/profile这个脚本。
sudo gedit /etc/profile
用此命令打开脚本后,在最后添加一行:
export PATH=$PATH:/usr/local/arm/arm-q3/bin
退出编辑后,执行命令:
source /etc/profile
这样,不需要重启linux,此脚本会立即生效。
最后,打开linux源码根目录的Makefile文件,查找CROSS_COMPILE
,然后将其改为
CROSS_COMPILE ?= /usr/local/arm/arm-q3/bin/arm-none-linux-gnueabi-
注意:有的Makefile里的CROSS_COMPILE默认没有写完整的路径,而是只写了arm-none-linux-gnueabi-
,这样有一个弊端:那就是当你在PATH中同时添加了好几个交叉编译工具包的路径时,由于编译时用的编译器名字都叫arm-none-linux-gnueabi-xxx,可能出现Makefile在PATH中寻找编译器时选择了错误的同名编译器,导致出现一些莫名其妙的错误,比如:
garbage following instruction -- `dmb ish'
2.开发工具和依赖库的安装
此部分分为必需的部分和可选的部分
2.1. 必需部分
这部分主要是编译内核所必需的工具和依赖库:make,gcc,u-boot-tools,32位系统的库,menuconfig的依赖库等。具体需要执行如下命令进行安装:
sudo apt-get install build-essential libncurses-dev lib32z1 u-boot-tools
其中,
build-essential
为一个包含了多个开发必备工具和库的包,比如它包含gcc,make。
libncurses-dev
为menuconfig需要的库:没有它的话menuconfig将无法执行。
lib32z1
为32位系统的库:因为我们使用的是64位的ubuntu系统,而ARM上搭建的linux是32位的,所以需要安装32位系统的库。没有他的话,编译内核的时候会各种报错。
u-boot-tools
是构建uImage需要的工具。
注意:对于不同版本的内核,必需的开发工具和依赖库可能会增加。因此,在编译不同版本内核的时候,可能会遇到一些错误,到时候根据错误提示安装对应的工具和依赖库即可。
2.2.可选部分
这部分主要就看个人需要用到怎样的开发工具了,比如ssh,git之类的,根据自己需要安装。
ubuntu20.04.1 64位配置和编译Linux3.0内核
接下来我们就可以配置和编译内核啦。
配置内核我习惯用make menuconfig,毕竟他有图像化界面,也不用一条一条的全部配置一遍,很方便。
需要注意的是,用ubuntu20.04.1 64位编译内核时,会遇到如下报错:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373:
这应该是高版本ubuntu带来的问题,我们需要打开报错中提到的源文件:
/(内核根目录)/kernel/timeconst.pl
,然后修改第373行:将!define(@val)
改为!@val
即可。
之后再用make -j4编译内核,就能一路顺利啦。
如果觉得《ubuntu20.04.1 64位搭建嵌入式linux开发环境》对你有帮助,请点赞、收藏,并留下你的观点哦!