@cyysu
2017-10-29T05:15:41.000000Z
字数 3289
阅读 2029
- 时间:2017年10月27日19:06:55
- 作者:Kali
- 邮箱:cyysu.github.io@gmail.com/2869905223@qq.com/微信lwyx1413
- 版本:4.0
- 描述:ARM平台的Nodejs移植总结篇
嵌入式Linux
# 由于ARM平台的编译器版本以及Nodejs支持的版本,我们这里选择Python2.6.6版本进行Nodejs的移植。# 第一步 下载源码我这里提供了三个版本的pyhton以供下载,建议采用Python2.6.6,这里采用源码安装。
python2.5
python2.6.7
python2.6.6
# 第二步 生成配置文件以及安装./configure --prefix=/usr/local --enable-sharedmake && sudo make install# 第三步 修改链接文件sudo ln -sf /usr/local/lib/libpython2.6.so /usr/lib/libpython2.6.so.1.0sudo ln -sf /usr/local/bin/python2.6 /usr/bin/python# 这一过程可能会出现几个包没安装上。不过不影响我们的程序,这个在Python2.6版本中就是不支持的。在Python2.7版本中已经更改过来了。# 第四步 验证mj@DZ:~/node-v0.12.6$ pythonPython 2.6.6 (r266, Oct 27 2017, 16:43:45)[GCC 5.4.0 20160609] on linux4Type "help", "copyright", "credits" or "license" for more information.>>># 整个编译过程Python这里可能会出现的问题1. 无法导入sha什么的模块问题====> 取消红颜色部分的注释,修改完需要重新编译。

2. 无法导入bz2模块的问题====> 下载bzip2-1.0.6源码包,编译安装。

3. 如果你安装的不是我说的这个版本,可能你源码安装Python的时候会缺少什么readline ssl还有其他之类的。这里需要安装以下依赖关系。sudo apt install -y libreadline-dev libssl-dev libbz2-dev build-essential sqlite3 tk-dev libsqlite3-dev libc6-dev libgdbm-dev libncursesw5-dev或者也可以尝试下面的做法:# 将setup.py文件修改如下lib_dirs = self.compiler.library_dirs + ['/lib64', '/usr/lib64','/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu',]# 然后回到目录下面,执行下面操作python setup.py install
注意以上操作完毕之后都需要重现make&&sudo make install
注意以上操作完毕之后都需要重现make&&sudo make install
注意以上操作完毕之后都需要重现make&&sudo make install
好了,准备工作做完之后就是开始配置我们的交叉编译工具了。
笔者测试过的两款交叉工具,版本信息如下:


解压交叉工具即可,当然这个交叉工具你也可以自己制作。制作教程有机会写一篇文章来进行交流一下。环境配置信息如下:
export PATH=/home/mj/arm-zhongxing/bin:$PATH# 这下面的部分是配置Nodejs的变量信息export CC=arm-linux-uclibcgnueabi-gccexport CXX=arm-linux-uclibcgnueabi-g++export LD=arm-linux-uclibcgnueabi-ldexport RAINLIB=arm-linux-uclibcgnueabi-rainlibexport AR=arm-linux-uclibcgnueabi-arexport CFLAGS=-staticexport CXXFLAGS=-staticexport LDFLAGS=-static
配置图如下:

配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效。
配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效。
配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效。
# 第一步 生成Makefile./configure --prefix=/home/node --dest-cpu=arm --without-snapshot --dest-os=linux这里可能会出现下面这个情况。我们之前已经设置了一些变量,这里怎么回事呢?

这里显示变量也显示设置出来了
root@DZ:/home/mj/node-v0.12.6# echo $CCarm-linux-uclibcgnueabi-gcc
这个我们就要看我们的configure文件了,文件内容如下:

从这里我们可以看出,我们设置的CC是通过Python程序获取到的,那么出问题的可能性很有可能就是这里了,我们手动执行一下代码看看输出的信息是什么?执行代码如下:

从上面的结果显示我们返回中增加了一些特殊字符,那么我们就知道该怎么做了,修改代码如下:

然后继续执行我们的代码,见证奇迹的时刻到了。

好了,上面哪个仅仅是个小插曲,出现这个情况与人品有关系。有时不会出现,出现了就按照上面进行解决。下面继续我们的Nodejs源码编译,后面还有更坑的地方。# 第二步 执行make,这个时候就会输出我们要的程序了。这个时候可能会一番丰顺的执行完了,也不会出现错误。笔者这里测试出现了以下错误。

按照错误的指示,可以修改如下内容尝试一下

static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b) {return a->st_ctim.tv_nsec == b->st_ctim.tv_nsec&& a->st_mtim.tv_nsec == b->st_mtim.tv_nsec&& a->st_birthtim.tv_nsec == b->st_birthtim.tv_nsec&& a->st_ctim.tv_sec == b->st_ctim.tv_sec&& a->st_mtim.tv_sec == b->st_mtim.tv_sec&& a->st_birthtim.tv_sec == b->st_birthtim.tv_sec&& a->st_size == b->st_size&& a->st_mode == b->st_mode&& a->st_uid == b->st_uid&& a->st_gid == b->st_gid&& a->st_ino == b->st_ino&& a->st_dev == b->st_dev&& a->st_flags == b->st_flags&& a->st_gen == b->st_gen;}
或者尝试下面这种做法

或者你可能还会遇到下面这个文件没有缺少一些符号问题

笔者这个情况出现过,但是重新编译一次就没有在出现这个问题了。这里不记得具体怎么解决的了,当时在研究其他问题,结果这个就可以了。这个问题先留着,后续遇到在回来补充一下。



Nodejs源码下载地址
bzip2-1.0.6.tar.gz

如果你遇见这个问题,那么根据我查找的资料而言,这个是一个bug,在高版本中已经修复了这个问题,建议你更换一些版本尝试一下,但是你的版本也不能选择太高,太高的时候你的Python也会不支持。因此要适当选择自己node版本。

支付宝 微信