[关闭]
@cyysu 2017-10-29T05:15:41.000000Z 字数 3289 阅读 1899

嵌入式ARM移植nodejs教程

  • 时间:2017年10月27日19:06:55
  • 作者:Kali
  • 邮箱:cyysu.github.io@gmail.com/2869905223@qq.com/微信lwyx1413
  • 版本:4.0
  • 描述:ARM平台的Nodejs移植总结篇

嵌入式Linux


安装Python2.6

  1. # 由于ARM平台的编译器版本以及Nodejs支持的版本,我们这里选择Python2.6.6版本进行Nodejs的移植。
  2. # 第一步 下载源码
  3. 我这里提供了三个版本的pyhton以供下载,建议采用Python2.6.6,这里采用源码安装。

python2.5
python2.6.7
python2.6.6

  1. # 第二步 生成配置文件以及安装
  2. ./configure --prefix=/usr/local --enable-shared
  3. make && sudo make install
  4. # 第三步 修改链接文件
  5. sudo ln -sf /usr/local/lib/libpython2.6.so /usr/lib/libpython2.6.so.1.0
  6. sudo ln -sf /usr/local/bin/python2.6 /usr/bin/python
  7. # 这一过程可能会出现几个包没安装上。不过不影响我们的程序,这个在Python2.6版本中就是不支持的。在Python2.7版本中已经更改过来了。
  8. # 第四步 验证
  9. mj@DZ:~/node-v0.12.6$ python
  10. Python 2.6.6 (r266, Oct 27 2017, 16:43:45)
  11. [GCC 5.4.0 20160609] on linux4
  12. Type "help", "copyright", "credits" or "license" for more information.
  13. >>>
  14. # 整个编译过程Python这里可能会出现的问题
  15. 1. 无法导入sha什么的模块问题
  16. ====> 取消红颜色部分的注释,修改完需要重新编译。

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

  1. 3. 如果你安装的不是我说的这个版本,可能你源码安装Python的时候会缺少什么readline ssl还有其他之类的。这里需要安装以下依赖关系。
  2. sudo apt install -y libreadline-dev libssl-dev libbz2-dev build-essential sqlite3 tk-dev libsqlite3-dev libc6-dev libgdbm-dev libncursesw5-dev
  3. 或者也可以尝试下面的做法:
  4. # 将setup.py文件修改如下
  5. lib_dirs = self.compiler.library_dirs + [
  6. '/lib64', '/usr/lib64',
  7. '/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu',
  8. ]
  9. # 然后回到目录下面,执行下面操作
  10. python setup.py install

注意以上操作完毕之后都需要重现make&&sudo make install
注意以上操作完毕之后都需要重现make&&sudo make install
注意以上操作完毕之后都需要重现make&&sudo make install

好了,准备工作做完之后就是开始配置我们的交叉编译工具了。

配置交叉编译工具

笔者测试过的两款交叉工具,版本信息如下:

中兴交叉工具

致远电子交叉工具

解压交叉工具即可,当然这个交叉工具你也可以自己制作。制作教程有机会写一篇文章来进行交流一下。环境配置信息如下:

  1. export PATH=/home/mj/arm-zhongxing/bin:$PATH
  2. # 这下面的部分是配置Nodejs的变量信息
  3. export CC=arm-linux-uclibcgnueabi-gcc 
  4. export CXX=arm-linux-uclibcgnueabi-g++
  5. export LD=arm-linux-uclibcgnueabi-ld
  6. export RAINLIB=arm-linux-uclibcgnueabi-rainlib
  7. export AR=arm-linux-uclibcgnueabi-ar
  8. export CFLAGS=-static
  9. export CXXFLAGS=-static
  10. export LDFLAGS=-static

配置图如下:

配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效
配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效
配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效

源码编译Nodejs

  1. # 第一步 生成Makefile
  2. ./configure --prefix=/home/node --dest-cpu=arm --without-snapshot --dest-os=linux
  3. 这里可能会出现下面这个情况。我们之前已经设置了一些变量,这里怎么回事呢?

这里显示变量也显示设置出来了

  1. root@DZ:/home/mj/node-v0.12.6# echo $CC
  2. arm-linux-uclibcgnueabi-gcc 

这个我们就要看我们的configure文件了,文件内容如下:

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

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

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

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

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

  1. static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b) {
  2. return a->st_ctim.tv_nsec == b->st_ctim.tv_nsec
  3. && a->st_mtim.tv_nsec == b->st_mtim.tv_nsec
  4. && a->st_birthtim.tv_nsec == b->st_birthtim.tv_nsec
  5. && a->st_ctim.tv_sec == b->st_ctim.tv_sec
  6. && a->st_mtim.tv_sec == b->st_mtim.tv_sec
  7. && a->st_birthtim.tv_sec == b->st_birthtim.tv_sec
  8. && a->st_size == b->st_size
  9. && a->st_mode == b->st_mode
  10. && a->st_uid == b->st_uid
  11. && a->st_gid == b->st_gid
  12. && a->st_ino == b->st_ino
  13. && a->st_dev == b->st_dev
  14. && a->st_flags == b->st_flags
  15. && a->st_gen == b->st_gen;
  16. }

或者尝试下面这种做法

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

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

输出展示

软件下载区

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

可能会遇到的问题

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

最后给出一篇比较好的参考文章

可能会有你遇到的问题

打赏

                    支付宝                                                         微信

微信与支付宝支付

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注