ESP8266交叉编译器xtensa-lx106-elf 在Linux下编译与生成
原作者:杭州_燕十三
来源:CSDN
原文:https://blog.csdn.net/flyingcys/article/details/71357261
版权声明:本文为博主原创文章,转载请附上博文链接!
把自己遇见的情况修改原文,进行补充。准备使用的是服务器系统,性能较高,所以手动配置编译工具链,充分发挥服务器性能。
要在PC上开发ESP8266,无论是Linux还是Windows首先需要有一套交叉编译环境,才能将编写好的代码编译成可在ESP8266上固化和运行的bin文件。官方提供了已编译完成的Linux下的交叉编译器可供下载,也提供了移植好的crosstool-NG给有自己编译需求的开发者自行编译。今天我们就是要自己来编译crosstool-NG来自己编译出Esp8266在Linux下的交叉编译工具链。
一、编译环境配置
由于编译crosstool-NG依赖编译环境,本次编译在Ubuntu_16.04.2_64bit下进行,gcc版本为5.4.0,make版本为4.1,可通过gcc -v/make -v查看。
文本后续提到的在编译过程中出现的错误都是基于当前环境下的,如编译环境不一致导致其他错误,可按照类似方法解决。
在编译crosstool-NG之前,我们先安装编译需要的软件包,通过以下命令一次性安装完成:
sudo apt-get install git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev wget gawk libc6-dev-amd64 python-serial libexpat-dev
二、crosstool_NG下载
ESP8266内置Tensilical L106 32bit微处理器,我们使用的是大侠jcmvbkbc制作的Xtensa系列crosstool-NG,可在https://github.com/jcmvbkbc/crosstool-NG查看crosstool-NG源文件。
在命令行输入:git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git ,git clone -b表示只克隆lx106分支,该分支下总共有30425个文件。
1.在该目录下执行:
(1) ./bootstrap
(2) ./configure
(3) make
(4) make install
其中:
./bootstrap通过autoconf生成.configure
./configure 将检查依赖文件包。
如缺少安装软件包某软件包,./configure将自动终止直至安装完成。
我在安装中出现了如下错误:
1)缺少libtool。
因为工具链需要的是libtool-1.5.26版,使用apt-get得到的是最新版本,不适用。所以需要手动安装。
① 删除已安装(假设已安装)版本sudo apt-get remove libtool
② 至ftp://ftp.gnu.org/gnu/libtool/下载libtool-1.5.26版,并解压libtool-1.5.26目录
③ 在libtool-1.5.26目录下依次执行
a)./configure
b)make
c)sudo make install
libtool完成安装
2.完成上述操作后,在crosstool_NG目录下执行:./ct-ng xtensa-lx106-elf
三、crosstool_NG配置
crosstool-NG默认配置也可以编译生成Esp8266交叉工具链,但是编译时间特别长,而且特别容易出错。针对这2点进行一些配置。
在crosstool-NG目录下执行./ct-ng menuconfig进行配置
1.配置多线程编译
“Paths and misc options”->“Number of parallel jobs”
默认为0,设置为4;
这个数字不易过大,常见修改方式:CPU内核数*2;如当前PC的CPU为双核,那这里就设置为4。本项目使用的服务器具有48核,考虑到一般
只使用一半的核心,所以这里我配置为40.
以上配置设置完成后,在后续执行./ct-ng build时无需手工指定参数。即无需./ct-ng build.4(其实内部还是通过make -j4去执行)。
2.保存编译中间步骤
“Paths and misc options”->“Debug crosstool-NG”->“Save intermediate steps”
crosstool-NG默认配置下每次编译都是重新开始的,无论上一次编译到哪一步,是否成功!
完成以上设置后,保存并退出。
四、crosstool_NG编译
完成以上设置后,在crosstool-NG目录下执行./ct-ng build开始编译,编译之前要先下载对应的源码包并复制到对应的隐藏文件夹
本次编译需要的源码包有:
gcc-4.8.2
cloog-0.18.4
binutils-2.24
gdb-7.5.1
gmp-5.1.3.tar
isl-0.12
mpc-1.0.2
mpfr-3.1.2.tar
需要下载的源码包名称及版本在根目录下.config文件内配置。源码包下载至根目录下.build/tarballs目录,配置文件和目录为隐藏目录,在Ubuntu下需要按ctrl+h显示才能看到。.config文件和.build/tarballs目录在后面我们都要用到。
下载完成后全部放至.build/tarballs。以下为下载地址:
gcc-4.8.2:ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.2/
cloog-0.18.4:http://www.cloog.org/
binutils-2.24:ftp://ftp.gnu.org/gnu/binutils/
gdb-7.5.1:ftp://ftp.gnu.org/gnu/gdb/
gmp-5.1.3.tar:ftp://ftp.gnu.org/gnu/gmp/
isl-0.12:http://isl.gforge.inria.fr/
mpc-1.0.2:ftp://ftp.gnu.org/gnu/mpc/
mpfr-3.1.2.tar:ftp://ftp.gnu.org/gnu/mpfr/
如果在windows系统下下载以上软件,建议不要使用迅雷等下载工具。将以上下载文件copy至.build/tarballs,然后在根目录下执行./ct-ng build。
五、xtensa-lx106-elf测试
1.在build目录下执行sudo cp -f xtensa-lx106-elf /opt并正确配置环境变量,ubuntu下环境变量配置可参照《Linux环境变量设置》一文。
2.
在github上下载最新esp8266的rtos版本sdk至本地
git clone https://github.com/espressif/ESP8266_RTOS_SDK
ESP8266_RTOS_SDK在linux工程运行配置请参照本文博客《ESP8266交叉编译环境搭建之linux篇》一文,这里不再重复叙述。
运行SDK内部的sample,你就会发现,编译出错了,这就是我们剩下的5%的工作。
1)提示缺少stdint.h文件
执行wget -O include.tgz https://github.com/esp8266/esp8266-wiki/raw/master/include.tgz
下载并解压至交叉编译器对应文件夹
sudo tar zxvf include.tgz -C /opt/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/
2)提示缺少libhal.a文件
执行wget -O libhal.a https://github.com/esp8266/esp8266-wiki/raw/master/libs/libhal.a
下载libhal.a文件,并复制至交叉编译器对应文件夹
sudo cp -rf libhal.a /opt/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/
3)提示缺少libc.a文件
执行wget -O libc.a https://github.com/esp8266/esp8266-wiki/raw/master/libs/libc.a
下载libc.a文件,并复制至交叉编译器对应文件夹
sudo cp -rf libhal.a /opt/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/
ESP8266交叉编译器xtensa-lx106-elf 在Linux下编译与生成的更多相关文章
- Linux下编译tinyxml生成动态库
首先去到sourceforge下载tinyxml的源码,https://sourceforge.net/projects/tinyxml/?source=dlp,最新版本是2.6.2. 将下载成功的t ...
- linux下编译qt5.6.0静态库——configure配置
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- <iostream> 和 <iostream.h>的区别 及 Linux下编译iostream.h的方法
0.序言 其实2者主要的区别就是iostream是C++标准的输入输出流头文件,而iostream.h是非标准的头文件. 标准头文件iostream中的函数属于标准命令空间,而iostream.h中的 ...
- 嵌入式 Linux下编译并使用curl静态库
#x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...
- 【原创】Linux下编译链接中常见问题总结
前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...
- Linux下动态库生成和使用
Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...
- Linux下静态库生成和使用
Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...
- linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- linux下编译原理分析
linux下编译hello.c 程序,使用gcc hello.c,然后./a.out就能够执行:在这个简单的命令后面隐藏了很多复杂的过程,这个过程包含了以下的步骤: ================= ...
随机推荐
- Django create和save方法
Django的模型(Model)的本质是类,并不是一个具体的对象(Object).当你设计好模型后,你就可以对Model进行实例化从而创建一个一个具体的对象.Django对于创建对象提供了2种不同的s ...
- Java的selenium代码随笔(4)
//高亮操作元素public void highlight(WebElement webElement) {JavascriptExecutor javascriptExecutor = (Javas ...
- Python 执行 shellcode
import urllib2 import ctypes import base64 # 从我们的web服务器上下载shellcode url = "http://rinige.com/sh ...
- java的List列表转成Tree(树形)结构列表
直接看借鉴博客:https://blog.csdn.net/massivestars/article/details/53911620/ 由于我的业务没有父子级id两个字段,只有一个层级id字段来分层 ...
- js04-DOM对象一
一.什么是HTML DOM HTML Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 HTML 文档呈现 ...
- css实现多行文本溢出显示省略号(…)
WebKit浏览器或移动端的页面在WebKit浏览器或移动端(绝大部分是WebKit内核的浏览器)的页面实现比较简单,可以直接使用WebKit的CSS扩展属性(WebKit是私有属性)-webkit- ...
- map遍历性能记录
map遍历可以通过keySet或者entrySet方式. 性能上:entrySet略胜一筹,原因是keySet获取到key后再根据key去获取value,在查一遍,所以慢一些. keySet: //先 ...
- Java【第七篇】面向对象之类设计
Java类的继承 类继承语法规则 < 修饰符> class < 子类名称> [extends < 父类>] { <属性和方法的声明> } 类的继承 子 ...
- Python3 与 C# 并发编程之~ 进程篇
上次说了很多Linux下进程相关知识,这边不再复述,下面来说说Python的并发编程,如有错误欢迎提出- 如果遇到听不懂的可以看上一次的文章:https://www.cnblogs.com/dot ...
- vue学习笔记(三)- vue2.x引入Element-ui
webpack+vue2.x+element-ui 作者:狐狸家的鱼 本文链接:vue2.x引入Element-ui GitHub:sueRimn 1.新建项目 vue init webpack vu ...