@cyysu
2017-10-29T05:15:41.000000Z
字数 3289
阅读 1899
- 时间: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-shared
make && sudo make install
# 第三步 修改链接文件
sudo ln -sf /usr/local/lib/libpython2.6.so /usr/lib/libpython2.6.so.1.0
sudo ln -sf /usr/local/bin/python2.6 /usr/bin/python
# 这一过程可能会出现几个包没安装上。不过不影响我们的程序,这个在Python2.6版本中就是不支持的。在Python2.7版本中已经更改过来了。
# 第四步 验证
mj@DZ:~/node-v0.12.6$ python
Python 2.6.6 (r266, Oct 27 2017, 16:43:45)
[GCC 5.4.0 20160609] on linux4
Type "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-gcc
export CXX=arm-linux-uclibcgnueabi-g++
export LD=arm-linux-uclibcgnueabi-ld
export RAINLIB=arm-linux-uclibcgnueabi-rainlib
export AR=arm-linux-uclibcgnueabi-ar
export CFLAGS=-static
export CXXFLAGS=-static
export LDFLAGS=-static
配置图如下:
配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效。
配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效。
配置环境变量到这里就结束了,这里没什么好说的,最后不要忘记让环境变量生效。
# 第一步 生成Makefile
./configure --prefix=/home/node --dest-cpu=arm --without-snapshot --dest-os=linux
这里可能会出现下面这个情况。我们之前已经设置了一些变量,这里怎么回事呢?
这里显示变量也显示设置出来了
root@DZ:/home/mj/node-v0.12.6# echo $CC
arm-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版本。
支付宝 微信