最近在做一个项目,硬件平台是ARM Cortex A8的处理器,软件平台当然是GNU/linux。本来计划全部是用C写的,嵌入式吗。可以老板偏爱node.js,认为很是高大上。
没办法,移植吧。Baidu了一下,网上node.js移植到arm的内容不太多,发现了一篇文章,CSDN上,王山二的《将node.js移植到arm开发板》,很是有启发。但是为啥叫山二呢,小二多好听。还有几个是介绍raspberryPi下移植的,姑且参考一下吧。
硬件平台差不多,都是Cortex A8,不过我的是Ti的AM3357处理器。收集好资料后,上node的网站上看看。中文网最新的是8.4,英文网最新的是8.5(现在已更新到8.6).好吧,我对这个有偏执,当然用最新的8.5。到下载页面一看,耶,有移植好的耶。如下图:
本人一向很懒的,能坐着绝不站着。这款处理器是ARMv7l的平台,正好有移植好的可用。
下载,node-v8.5.0-linux-armv7l.tar.xz。
安装,将文件复制到/usr目录下。
xz -d node-v8.5.0-linux-armv7l.tar.xz
tar -vxf node-v8.5.0-linux-armv7l.tar.xz
在usr/下建立了一个node-v8.5.0-linux-armv7l的目录。
然后配置路径,方法是sudo vi /etc/profile,在里面将相关的路径加进去。网上相关文章很多,这里就不重复了。配置好有,source /etc/profile。
然后node -v。啥?!提示:
‘node’: No such file or directory
???,看路径配置没问题呀。
cd /node-v8.5.0-linux-armv7l/bin
然后ls -al:
权限配置也无问题。
然后在此目录下直接执行 node -v,提示依旧。
file node,看看:
应该在问题呀。将百度过来的资料反复看,无果。怎么办?只能自己编译试试了。这是山二兄弟的文章就可以参考了。
打开我的ubutun虚拟机,我的是ubutun Kylin 17.04。为啥用kylin呢,主要是习惯了windows的界面,搜狗输入法和WPS。
因为是ARM v7l的内核,需要的交叉编译器为gcc-linaro-6.3.1-2017.05-i686_arm-linux-gnueabihf,下载并且安装到
/usr/gcc-linaro-6.3.1-2017.05-i686_arm-linux-gnueabihf目录下,然后设置环境变量:
在/etc/profile文件增加:
export PATH=$PATH:/usr/gcc-linaro-6.3.1-2017.05-i686_arm-linux-gnueabihf/bin
export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++ export LD=arm-linux-gnueabihf-ld export RAINLIB=arm-linux-gnueabihf-rainlib export AR=arm-linux-gnueabihf-ar
保存后然后执行source /etc/profile,交叉编译环境设置成功。因为本机已经安装过编译环境,所以
yum install gcc gcc-c++ autoconf automake和 yum install openssl openssl-devel这两个步骤是不用了。
node的配置文件生成需要Python2.7以上版本,因为ubutun 17里面已经配置好,所以不用配置。
下载node v8.5.0源码文件,并解压到/home,会建立一个/home/node v8.5.0的目录。
mkdir /home/armnodejs --->编译后node.js的二进制文件放到此目录。
cd /home/node v8.5.0 ,然后执行:
./configure --prefix=/home//armnodejs --dest-cpu=arm --dest-os=linux --cross-compiling -- fully-static --with-arm-float-abi=hard --without-snapshot
这里编译参数说明可以参考configure --help。
其中--fully-static表示是静态编译,不采用动态库方式。
--dest-cpu=arm表示目标代码是arm。
如果没有其他错误,这时会自动生成相应的make文件。然后执行:
make -j4
make install
这是相应的二进制目标文件会安装到armnodejs目录中。
将该目录打包:
tar -cf armnodejs.tar armnodejs
将其拷贝到目标系统中,这里我是拷贝到目标系统的opt目录下了。
执行解压:
tar -vxf armnodejs.tar
vi /etc/profile,添加如下内容:
保存退出后,执行 source /etc/profile
然后测试一下,node -v,提示:v8.5.0。编译成功。
这是进入到armnodejs/bin目录中,file node:
和官网上下载的移植好的,只有一个是shared linked,这个是statically linked不同。那么试验一下,编译的时候将-- fully-static参数删掉,
重新生成二进制文件。然后拷贝到目标板上执行。结果和官网上下载的提示完全一样。不知道为啥我这个目标板的linux系统有这个问题,如果有
哪位大咖遇到此类问题并解决的,希望告知,将不胜感谢。
node.js可以使用了,但是还有一个问题,不能裸奔呀,有很多好的node.js插件可以大大加快我们编程的速度。比如think.js。
想干就干,
npm install -g think-cli
结果,又悲催了:
居然,居然安装出错。 查找若干资料,试验若干插件express,koa......,结果全部一样。
哥不是一个技术控,没有那个时间和信心去专研node.js的源码。那么只能曲线救国了,就是在ubutun中安装各种插件,然后拷贝过来使用。
需要的只是修改相应package.json中的内容。比如think-cli,拷贝过来后,将package包中相应的路径改为当前的路径,然后用ln指令设置一个软连接
ln -s ../lib/node_modules/think-cli/index.js thinkjs即可。
那么测试一下thinkjs。别忙,建立think项目的时候是要执行npm install的,可想而知,在目标板直接执行是不会成功的。方法同安装think一样,
在ubutun下执行:
$ thinkjs new demo;
$ cd demo;
$ npm install;
之后将项目文件夹demo拷贝到目标板上,逐一修改runtime/config/development.json、pm2.json及package.json里面的相关路径指向目标板的当前路径。
执行npm start:
> thinkjs-application@1.0.0 start /opt/demo
> node development.js
[2017-09-27 19:38:52.770] [2143] [INFO] - Server running at http://127.0.0.1:8360
[2017-09-27 19:38:52.813] [2143] [INFO] - ThinkJS version: 3.2.1
[2017-09-27 19:38:52.817] [2143] [INFO] - Enviroment: development
[2017-09-27 19:38:52.819] [2143] [INFO] - Workers: 1
[2017-09-27 19:39:15.889] [2149] [INFO] - GET /favicon.ico 404 84ms
[2017-09-27 19:39:16.215] [2149] [INFO] - GET / 200 196ms
表示node.js服务已经正常运行。
这时用浏览器在地址栏输入:http://127.0.0.1:8360。如果目标板没有GUI,则用远程计算机连接:http://10.100.1.61:8360(我的目标板的IP),
现在一切OK。如果需要安装其他插件,方法同上。
最后说一下,我的目标板是致远电子的9608。如果想彻底解决node.js的安装问题,只能以后有时间琢磨或者自己裁剪linux了。
来源:CSDN
作者:yifan3605
链接:https://blog.csdn.net/wanyi3605/article/details/78131241