【问题标题】:Cross-compiling Node.js for ARM6 (Raspberry Pi)为 ARM6 交叉编译 Node.js (Raspberry Pi)
【发布时间】:2012-06-14 17:49:06
【问题描述】:

我正在尝试让 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 以获得最终的可执行文件。将其复制到系统并运行它会产生以下错误:

Extension or internal compilation error at line 0.
Segmentation fault

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

【问题讨论】:

  • 有一个人试图对所有内容进行交叉编译,但最终在 RPI 上交叉编译了 v8 和编译节点。 blog.greg-net.co.uk/post/21228054876/… 这是在 Arch 中编译 RPI 的链接.. nodejs-news.com/nodejs-tech/nodejs-armv5-armv6-howto 你可能已经看过它们,但可能对其他人有好处..
  • 我不知道这需要多长时间...在我的 Raspberry Pi 上编译 node.js 0.10 所需的所有内容可能需要一个小时,而且它仍然在它上面 >.

标签: node.js arm cross-compiling v8 raspberry-pi


【解决方案1】:

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

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

【讨论】:

  • 如果你得到一个 NO_PUBKEY 错误,我确实尝试按照以下行获取并加载所需的密钥。 gpg --recv-keys AED4B06F473041FA --keyserver keys.gnupg.netgpg -a --export AED4B06F473041FA | apt-key add -祝你好运
  • 我一开始试过这个,但是可用的node.js版本是0.6,好像2岁了!至少 nvm 有一个更新的版本可用......但仍然是 0.7。
  • 我收到node -v --> “分段错误”。我该如何解决这个问题(除了从源代码构建)?
  • 这对我不起作用,libc6 在安装和卸载时出现段错误。我最终只是擦掉了我的 SD 卡并重新安装了 raspbian,因为我不知道如何清理它。
【解决方案2】:

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

apt-get 安装 npm

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      我用过@Adam M-W 的“包装”sn-p

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

      请注意,由于此问题,当前 (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!"
      

      【讨论】:

      • 这帮助我设置了一个不运行包管理器的嵌入式项目。非常感谢!
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        您现在可以做的只是提醒一下:

        sudo apt-get install nodejs npm
        

        【讨论】:

        • 这会安装最新版本的nodejs吗?当我运行这个节点时,下载了 0.6。
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-28
          • 2020-11-16
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 2012-07-19
          • 2016-09-22
          相关资源
          最近更新 更多