要在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
使用apt-get之前先确定下软件下载源在国内还是国外,推荐使用国内的阿里云镜像或163镜像速度比较快,不然下载速度就杯具了!记得下载前先sudo apt-get update下。

二、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个文件,git表示网络有些慢,需要一些时间。
经过漫长的等待后Clone终于完成,进入crosstool-ng文件夹,我们可以看到:

1.在该目录下执行:./bootstrap && ./configure --prefix=`pwd` && make && make install
当然也可分开执行4条依次执行。
其中:
./bootstrap通过autoconf生成.configure
./configure --prefix=`pwd`将检查依赖文件包,并通过--prefix配置安装路径为当前目录。pwd指令前后的为反单引号(tab键上面那个按键)。在linux的bash中,其用法同$()相同,用``括起来的内容为一个变量,`pwd`就是当前目录。
如缺少安装软件包某软件包,./configure将自动终止直至安装完成。
我在安装中出现了如下错误:
1)缺少libtool。
解决方法:sudo apt-get install libtool



发现已经安装了libtool,但是版本为2.4.6-0.1版。版本太高了?只能手动安装了!!!


① 删除已安装版本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.在该目录下执行:./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;
以上配置设置完成后,在后续执行./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开始编译。编译过程分多个步骤:
1.下载源码包:本次编译需要的源码包有:
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目录在后面我们都要用到。

2.自动/手动下载源码包
a)自动下载:
在crosstool-ng目录下执行./ct-ng build及开始编译前的第一步工作,编译依赖包下载,该步骤根据网络情况和服务器情况不同,非常耗时。
在未知源码包名称及版本情况下,可一步一步根据build后日志上显示的源码包文件名、版本号、下载路径去下载,然后放至.build/tarballs。下载完一个后,再执行./ct-ng build来确定下一个包。
b)手动下载:我们通过查看根目录下.config文件,得到源码包名称及版本号。下载完成后全部放至.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。然后开始满足的编译过程,根据电脑配置不同时间不同,需要耐心等待。


可以看到,我们配置的保存编译过程,可以在出错后只从出错未知开始重新编译


如编译过程中binutils_for_host出错,我们可以直接执行 ./ct-ng binutils_for_host+,之前编译过的就不需要重复运行。

一次性成功,耗时27分钟!是不是感觉so easy?
编译完成的交叉编译器在更目录下builds下,文件名为xtensa-lx106-elf


到这里,我们的交叉编译器生成工作已完成了95%,那剩下的5%呢?现在我们就把xtensa-lx106-elf到Ubuntu系统目录下,编译一下esp8266的工程试试!、

五、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/

再次编译SDK,编译成功!!!剩下的5%工作完成。

参考博客:http://blog.csdn.net/flyingcys/article/details/71357261

【物联网】 Ubuntu中生成交叉编译器xtensa-lx106-elf的更多相关文章

  1. Swift for OS X编译Linux?

    我对其他平台上Swift的构建过程感到困惑.Swift是否允许我在OSX上构建Linux项目,或者我是否需要在Linux上专门使用Swift来构建我计划在那里使用的任何东西?我查看了documentation,但这个主题并不是很清楚……

  2. Android ICS编译问题

    我成功下载了Android4.0.3的源代码.但我无法在我的机器上编译它.我的机器配置是UBUNTU11.1064位,4GBRAM当我运行午餐命令时收到以下错误.JDK已经在路径中.当我运行命令java-version时,我正在关注OutPut任何人都可以帮助继续吗?解决方法如果检查脚本build/core/find-jdk-tools-jar.sh,则可以看到它首先检查名为ANDROID_JAVA_HOME的环境变量.如果将ANDROID_JAVA_HOME环境变量设置为JDK路径,则应修复此错误.

  3. android-ndk – 使用arm-linux-androideabi-gcc编译对象的问题

    背景OSX是OS>R8NDK我正在使用AndroidGCC编译器来编译下面的类…我用以下命令做…所以由于缺乏gcc知识,我发现这一点,并尝试…有人可以帮我做我做错了吗?我错过了一个链接吗?解决方法您必须告诉GCC在哪里找到Android系统文件和标题.使用:>ndk-build和一个带有BUILD_EXECUTABLE的Android.mk>或–sysrootGCC选项[1][2]

  4. 微信小程序+mqtt,esp8266温湿度读取的实现方法

    这篇文章主要介绍了微信小程序+mqtt,esp8266温湿度读取的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 如何使用cygwin / mingw在Windows上编译PHP扩展?

    我正在尝试使用Cygwin在Windows上构建RabbitMQPHPwrapper和AMPQPHPwrapper.我已经成功构建了底层的C库,但我陷入了’PHPize’步骤:PHPize&&./configure–with-rabbit&&制造&&sudomakeinstall如果我理解正确,Windows上没有’PHPize’,那么如何构建我的PHP包装器?

  6. 在windows下运行linux gcc编译的程序

    好的,伙计们,希望这是一个非常简单的问题:有没有办法在Windows操作系统上使用gcc运行在linux下编译的C程序?请不要告诉我在windows下重新编译它,因为我已经尝试但看起来没有cwindows编译器有128位原生类型,并且使用bignum库使我的程序比10到100倍慢.有没有办法在Windows下实际运行linux二进制文件?有人告诉我一些关于cygwin的事情,但我不知道从哪里开始..非常感谢你!!

  7. 如何在Debian上编译DOS程序?

    对于我的汇编语言类,我们正在使用DPMI编写DOS程序.不幸的是,我一直没有访问32位Windows机器.在我使用的每台电脑上都安装了Debian虚拟机.我已经安装了DOSBox和DOSEMU.有什么办法可以在Linux而不是DOS中汇编和编译程序吗?我使用nasm,所以我似乎没有任何问题得到它在DOS格式化.但是,我无法通过编译器运行C代码并获得DOS可执行文件.有没有办法做到这一点,或者我将不得不在DOS下安装所有的工具?

  8. Windows – Qt MinGW另一个未定义的引用“WinMain @ 16”问题

    我尝试了一大堆C标志,但没有工作.有魔术吗附:当然我可以在Linux上搭建i386/amd64解决了:我只需要将以下行添加到创建库的.pro文件中:解决了:我只需要将以下行添加到创建库的.pro文件中:

  9. 在windows和linux上编译

    我是c的新手,我已经给了一些源代码,别人写的是在Windows上编译的.在linux编译之后,我有错误,因为linux不支持DWORD,WORD和UINT32.我有6个文件例如.A.h,A.c,B.h,B.c,C.h,C.c.这些关键字在所有文件中.所以我正在考虑2种可能的解决方案.哪个更好#define或typedef.1)2)对于第二部分,我想知道我应该把这些声明放在哪里.他们应该在头文件中,还是应该在源文件中?

  10. windows – Delphi交叉编译器为linux

    我想知道是否有任何Borland交叉编译器可以使我的Windows代码工作在linux没有葡萄酒.我使用winxp与delphi7.我一直在想知道是否可以编码在Windows中编码的相同工具,再次Linux,如何使用linux中的pascal代码编写相同的工具.谢谢最好的解决方案是Lazarus,FreePascal的delphi-likeGUI.如果您使用“纯”vcl,没有Windows内部或任

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部