25

我正在尝试让 node.js v0.7.9 为树莓派编译,但由于 node 和 v8 相当大,我希望能够在另一台更强大的 PC 上进行交叉编译。我正在使用arm-bcm2708-linux-gnueabi来自https://github.com/raspberrypi/tools的 linux-x86 工具链,并已使用它们成功地为系统构建其他可执行文件。我最终设置了 CC、CXX、CPP、STRIP、OBJCOPY 等。变量到环境变量中的工具链等价物并运行 configure with:./configure --dest-cpu=arm --without-snapshot以获得最终的可执行文件。将其复制到系统并运行它会产生以下错误:

Extension or internal compilation error at line 0.
Segmentation fault

node --version但是,对于任何非 JavaScript 任务(如和)都不会发生分段错误node --help。是否有任何我可能缺少的 CFLAGS/CXXFLAGS 导致此问题?有点迷茫……

4

7 回答 7

13

NodeJS 可用于一些 Linux 发行版的预编译: https ://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

由于 NodeJS 仍处于 Debian 测试阶段,为了在 Debian wheezy 下在我的 Raspberry Pi 上安装 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 上运行良好且稳定。

于 2012-06-21T21:29:34.320 回答
5

请注意 - 这对我来说非常有用,但没有安装 NPM。因此,如果您想要 NPM(我认为您肯定会这样做),请确保运行

apt-get 安装 npm

在从更新列表中删除更新位置之前安装节点之后。

于 2012-06-29T22:33:55.853 回答
5

自从最初提出这个问题以来,我一直在研究这个问题,甚至添加了一些补丁来帮助自动检测交叉编译器设置。存储库中的 Node.js(目前)是一个相当旧的版本,可能支持也可能不支持完整的硬浮点 (VFP) 架构。

有关完整详细的 HOWTO,请参阅 Nathan Rajlich 在http://n8.io/cross-compiling-nodejs-v0.8/上的文章

我已经在https://gist.github.com/3245130为其他不想为相同硬件经历所有这些麻烦的人发布了二进制文件

于 2012-10-13T12:43:39.653 回答
1

这是我编写的使用 Jenkins 为 ARMv6 (Raspbery Pi) 自动交叉编译 NodeJS 的脚本。

https://gist.github.com/hertzg/12c2d7fc40f68ff6deeb

我使用了@Adam MW 的“包装”片段

该脚本将自动下载所需的所有内容并开始构建。

请注意,v0.10.30由于此问题,当前 ( ) 版本将无法编译: https ://github.com/joyent/node/issues/8062#issuecomment-52541037

运行_PARAMS_NODEJS_SOURCE_ARCHIVE_URL=http://nodejs.org/dist/v0.10.29/node-v0.10.29.tar.gz以获取最新的可交叉编译版本。

#!/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!"
于 2014-08-18T21:11:48.743 回答
0

我设法交叉编译nodejs 0.10版并在飞思卡尔i.MX6上运行它。我创建了一个交叉编译脚本来设置环境和执行 make。该脚本基本上只是为我的交叉编译工具设置了 CC、CXX 等变量,并为编译器设置了拱门和其他一些标志。然后它使用 dest-cpu=arm 运行配置,我尝试也链接到 V8 库(我也交叉编译),但是当我在配置中包含该标志和路径时它不会编译。当我编译节点时,它是否编译了它自己的 V8,因为我设法在不指向 V8 库的情况下进行编译(我可以看到它在编译过程中正在编译一些 V8 的东西)?

于 2013-09-13T06:24:36.807 回答
0

只是提醒一下,您现在可以这样做:

sudo apt-get install nodejs npm
于 2014-01-07T22:01:11.777 回答
0

对于节点 0.12,http://conoroneill.net//download-compiled-version-of-nodejs-0120-stable-for-raspberry-pi-here有说明 + 预构建的二进制文件。

于 2015-02-19T17:36:54.320 回答