针对ARM6(Raspberry Pi)的交叉编译Node.js
我试图让node.js v0.7.9为树莓派编译,但由于node和v8相当大,我希望能够在另一个更强大的PC上进行交叉编译。我正在使用来自https://github.com/raspberrypi/tools的linux-x86 arm-bcm2708-linux-gnueabi
工具链,并使用它们成功构建了系统的其他可执行文件。我最终设置了CC,CXX,CPP,STRIP,OBJCOPY等。变量添加到环境变量中的工具链等价物中,并运行配置:./configure --dest-cpu=arm --without-snapshot
以获取最终的可执行文件。它复制到系统并运行。然而它产生以下错误:针对ARM6(Raspberry Pi)的交叉编译Node.js
Extension or internal compilation error at line 0.
Segmentation fault
然而,分段错误不会发生任何的像node --version
和node --help
非JavaScript的任务。是否有任何CFLAGS/CXXFLAGS我可能会丢失导致此问题?有点迷茫....
我一直在研究这一点,因为这个问题最初被问到,甚至添加了一些补丁来帮助自动检测交叉编译器设置。存储库中的Node.js(目前)是一个相当老的版本,并且可能支持或不支持完整的硬件浮动(VFP)体系结构。
对于一个完整详细的HOWTO,请参阅http://n8.io/cross-compiling-nodejs-v0.8/
弥敦道Rajlich的写了,我已经发布了别人的二进制谁不想在https://gist.github.com/3245130
是的NodeJS可用的预编译的几个Linux发行版: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
由于是的NodeJS仍处于测试阶段为Debian,以Debian的喘息下,在我的树莓派安装的NodeJS ,我这样做:
sudo su
echo deb ftp://ftp.dk.debian.org/debian/ sid main > /etc/apt/sources.list.d/sid.list
apt-get update
apt-get install nodejs
rm /etc/apt/sources.list.d/sid.list
apt-get update
exit
NodeJS在我的Raspberry Pi上工作得非常好而且稳定。
只是一个说明 - 这对我很好,但没有安装NPM。所以,如果你想NPM(你最稳妥我想)确保运行
的apt-get安装NPM
安装节点删除从更新列表中选择更新前的位置后。
我经历这一切麻烦了相同的硬件设法交叉编译nodejs 0.10版并在飞思卡尔i.MX6上运行它。 我创建了一个交叉编译脚本来设置环境和执行make。 该脚本基本上只是将CC,CXX等变量设置为我的交叉编译工具,另外还为编译器设置了arch和其他标志。 然后它运行配置与dest-cpu = arm 我试图也链接在V8库(我也交叉编译),但它不会编译,当我包含该标志加上在配置路径。 当我编译节点时,是否编译它自己的V8,因为我设法编译时没有指向V8库(我可以看到它在编译期间编译了一些V8的东西)?
这是我写的脚本来自动交叉编译使用ARMv6的詹金斯(Raspbery PI)的NodeJS。
https://gist.github.com/hertzg/12c2d7fc40f68ff6deeb
我用@Adam M-W公司的 '包装' 片断
该脚本会自动下载所需的一切,并开始建设。
只需注意电流(v0.10.30
)版本不会编译由于这个问题: 与_PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gz
https://github.com/joyent/node/issues/8062#issuecomment-52541037
运行以获取最新的交叉编译,能够版本。
#!/bin/bash
set -e
set -x
### IF we dont have archive url prefix
if [ -z "$_PARAMS_NODEJS_SOURCE_ARCHIVE_URL" ]; then
_PARAMS_NODEJS_SOURCE_ARCHIVE_URL=$(wget -qO- http://nodejs.org/dist/latest/ | egrep -o 'node-v[0-9\.]+.tar.gz' | tail -1);
_PARAMS_NODEJS_SOURCE_ARCHIVE_URL="http://nodejs.org/dist/latest/"$_PARAMS_NODEJS_SOURCE_ARCHIVE_URL
fi
if [ -z "$_PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL" ]; then
_PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL="https://github.com/raspberrypi/tools/archive/master.tar.gz"
fi;
NODEJS_SOURCE_ARCHIVE_FILENAME=$(basename $_PARAMS_NODEJS_SOURCE_ARCHIVE_URL)
NODEJS_SOURCE_DIRECTORY=${NODEJS_SOURCE_ARCHIVE_FILENAME%.tar.gz}
#Download NodeJS
echo "-> Searching for NodeJS "$NODEJS_SOURCE_ARCHIVE_FILENAME;
if [ ! -e "$PWD/$NODEJS_SOURCE_ARCHIVE_FILENAME" ]; then
echo "--> Downloading from "$_PARAMS_NODEJS_SOURCE_ARCHIVE_URL;
wget --no-check-certificate -O $NODEJS_SOURCE_ARCHIVE_FILENAME $_PARAMS_NODEJS_SOURCE_ARCHIVE_URL
echo "--> Download finished!"
fi;
echo "--> Extracting"
rm -rf $NODEJS_SOURCE_DIRECTORY
tar --overwrite -xf $NODEJS_SOURCE_ARCHIVE_FILENAME
echo "--> Linking"
ln -snf "$PWD/$NODEJS_SOURCE_DIRECTORY" "$PWD/node"
echo "-> Done!"
echo "-> Searching Raspberry Pi Toolset";
if [ ! -d "$PWD/rpi" ]; then
if [ ! -e "$PWD/rpi-tools.tar.gz" ] || [ -s "$PWD/rpi-tools.tar.gz" ]; then
echo "--> Downloading from "$_PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL
wget --no-check-certificate -O "rpi-tools.tar.gz" $_PRAMS_RPI_TOOLS_SOURCE_ARCHIVE_URL
echo "--> Download finished"
else
echo "--> Found rpi-tools.tar.gz."
fi
echo "--> Extracting"
tar xf "rpi-tools.tar.gz"
echo "--> Linking tools-master to rpi"
ln -snf "$PWD/tools-master" "$PWD/rpi"
else
echo "-> found"
fi;
echo "-> Done!"
echo "-> Cross-Compile..."
echo "--> Setup ENV"
export PATH="$PWD/rpi/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin:"$PATH
export HOST="arm-bcm2708hardfp-linux-gnueabi"
export CC="${HOST}-gcc"
export CXX="${HOST}-g++"
export AR="${HOST}-ar"
export RANLIB="${HOST}-ranlib"
export LD="${HOST}-ld"
export CPP="${HOST}-gcc -E"
export STRIP="${HOST}-strip"
export OBJCOPY="${HOST}-objcopy"
export OBJDUMP="${HOST}-objdump"
export NM="${HOST}-nm"
export AS="${HOST}-as"
"${HOST}-gcc" --version
echo "--> Waiting 5s to contiue"
pushd "$PWD/node"
sleep 5
echo "--> Clean"
make clean
echo "--> Configure"
./configure --prefix=/ --without-snapshot --dest-cpu=arm --dest-os=linux
echo "--> Build"
VERSION=${NODEJS_SOURCE_DIRECTORY##node-}
export BINARYNAME=node-${VERSION}-linux-arm-armv6j-vfp-hard
mkdir ${BINARYNAME}
make install DESTDIR=${BINARYNAME} V=1 PORTABLE=1
echo "--> Pack"
cp README.md ${BINARYNAME}
cp LICENSE ${BINARYNAME}
cp ChangeLog ${BINARYNAME}
tar -czf ${BINARYNAME}.tar.gz ${BINARYNAME}
echo "--> Cleanup"
popd
mv $PWD"/node/${BINARYNAME}.tar.gz" "./"
echo "-> Done!"
有一个人试图对所有东西进行交叉编译,但最终在RPI上交叉编译v8和编译节点。 http://blog.greg-net.co.uk/post/21228054876/building-node-js-for-raspberry-pi 这里是一个链接,用于编译Arch中的RPI .. http: //www.nodejs-news.com/nodejs-tech/nodejs-armv5-armv6-howto/ 你可能已经见过他们,但可能是个好别人.. – kmpm
我不知道这需要多久.. 。在我的Raspberry Pi上编译node.js 0.10所需的所有内容大概需要一个小时,如果你得到NO_PUBKEY错误,我还是试着按照下面的代码获取和加载所需的密钥,它仍然是它的 Pluto