node.js - 使用 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 代码。不知道如何继续前进 - 任何帮助或想法?:)
解决方案
推荐阅读
- java - 如何在 Java 中并行化顺序流
- mongodb - 尝试连接到本机 Mongo DB 驱动程序
- linux - 如何在 Pop!_OS 20.10 x86_64 Codename:groovy 上安装 ROS Gazebo
- windows - Rust,Windows 10:柴油机不工作,柴油机设置不提供输出
- macos - SwiftUI Mac Catalyst 滚动不适用于 StackNavigationViewStyle
- android - 如何从 AppWidgetProvider 调用 ViewModel 函数?
- mysql - VB.NET Refresh DataGridView 函数适用于插入和删除命令,但不适用于更新
- ruby-on-rails - Rails 控制器:有条件地调用同一控制器的另一个动作
- tsql - 在表中加载了多个文件,现在想查找最小值和最大值来自哪个文件
- bash - AWK 不会在输出区域设置中以十进制形式 (100.000) 过滤数字 100