首页 > 解决方案 > 使用 libstdc++.so.6 错误运行输出时,使用 `pkg` 为 ARMv7 / Ubuntu 14 构建 Node.js 二进制文件失败

问题描述

交叉编译?我有一个设备,我的公司仍在世界范围内制造和部署,在 ARMv7 处理器上运行 Ubuntu 14.04.3 ...。我有一个我正在为产品系列创建的节点应用程序,我也想在这个设备上运行它。尝试直接在其上安装和运行节点的整个nvm路线,但 gyphy 无法在设备上本地从项目构建一些依赖项。我真的更愿意使用pkg构建二进制文件来部署到设备。

如果你不熟悉,pkg是:https ://www.npmjs.com/package/pkg

但是,examples/express使用 pkg 4.4.9(在 linux 机器上)从 pkg repo 构建示例pkg . --targets node10.15.3-linux-armv7 --no-bytecode并将生成的二进制文件 scp'ing 到运行armv7/ Ubuntu 14 设置的 IOT 设备,尝试运行时出现以下错误二进制:

./express-example: relocation error: ./express-example: symbol
_ZTVNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE, 
version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

(添加换行以打破长线)

谷歌搜索错误(特别是关于 GLIBC 和 libstdc++.so.6)让我无处可去。我不知道设备上的 libstdc++ 是太旧还是太新。尝试更新 libstdc++ 但它说它已经是最新版本(对于那个操作系统)。我不知道从这里去哪里......有没有办法通过 pkg 使用不同的选项编译二进制文件,或者静态链接它需要的库而不是依赖系统库?

此外,当我尝试使用较新的节点版本(如 10.21.0 等)时,它会失败并显示“无法构建”消息。我知道我可以在 ARM 的 linux 机器上交叉编译常规 C/C++ 代码(我们目前在 linux 机器上使用云中的 Jenkins 进行此操作),那么有没有办法让交叉编译在构建时工作?

这是使用 10.21 构建的错误:

[root@decidr ~/devel/pkg/examples/express]# ./node_modules/.bin/pkg . --targets node10-linux-armv7 --no-bytecode
> pkg@4.4.9
> Fetching base Node.js binaries to PKG_CACHE_PATH
  fetched-v10.21.0-linux-armv7 [                    ] 0%
> Error! 404 Not Found
  https://github.com/zeit/pkg-fetch/releases/download/v2.6/uploaded-v2.6-node-v10.21.0-linux-armv7
> Asset not found by direct link:
  {"tag":"v2.6","name":"uploaded-v2.6-node-v10.21.0-linux-armv7"}
> Not found in GitHub releases:
  {"tag":"v2.6","name":"uploaded-v2.6-node-v10.21.0-linux-armv7"}
> Building base binary from source:
  built-v10.21.0-linux-armv7
> Error! Not able to build for 'armv7' here, only for 'x64'

我发现自己陷入了困境 - 无法直接在设备上运行节点,并且设备不会运行pkg-built 二进制文件,即使它构建了 ARMv7 代码。不知道如何继续前进 - 任何帮助或想法?:)

标签: node.jslinuxubuntu-14.04libstdc++

解决方案


推荐阅读