我有一个C++ binary
,它在本地centos
上运行良好。最近,我开始学习docker
,并尝试在C++
上运行我的centos docker
应用程序。
首先,我从泊坞枢纽中提取了centos:latest
,并在其上安装了C++
应用程序,该应用程序成功运行,没有任何问题。现在我在raspberry-pi上安装了docker并再次拉了centos并尝试在其上运行相同的应用程序,但它给了我错误。
bash:无法执行二进制文件
通常,当我们尝试在不同的体系结构上运行应用程序时会出现此错误。我在raspberry-pi上检查了cat etc/centos-release
,结果是CentOS Linux release 7.6.1810 (AltArch)
,其中本地centos的结果是CentOS Linux release 7.6.1810 (Core)
uname -a
如下
raspberry-pi,centos docker Linux c475f349e7c2 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l armv7l armv7l GNU/Linux
centos,centos docker Linux a57f3fc2c1a6 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
编辑:
另外,file myapplication
TTCHAIN: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.24, BuildID[sha1]=287b501c8206893f7819f215ee0033586212b143, with debug_info, not stripped
我的问题是我如何运行在raspberry-pi模型3上从docker提取的centos相同的本机应用程序。
答案 0 :(得分:1)
您的应用程序已针对x86-64构建。英特尔x86-64二进制文件无法在ARM处理器上运行。
您有两种追求的途径:
如果没有该应用程序的源代码,则需要一个可在Raspberry Pi上运行的x86-64仿真器。考虑到Pi的功能较少,以及Intel起诉任何为其处理器创建仿真器的人的倾向性,我怀疑您会发现它是公开可用的。
如果您具有应用程序的源代码,则需要将其重建为Raspberry Pi可执行文件。您似乎知道它是用C ++编写的。 Raspberry Pi提供了GCC和其他工具链(最有可能在Pi上使用“ yum install gcc”来为您抓取编译器和工具)。构建应用程序应该与为x86_64构建应用程序极为相似。
您可以找到一个交叉编译器,该编译器可以让您从x86_64盒中为Pi进行构建,但这会变得很复杂。
答案 1 :(得分:0)
可能是您正在尝试在32位处理器上运行64位二进制文件,但是肯定需要更多信息才能知道。
您可以在外壳程序中使用file
命令进行检查。您可能需要使用-m32
标志将原始系统重新编译为gcc。
答案 2 :(得分:0)
请在两个设备上都输入“ uname -a”,然后发布结果。
最有可能处理器或库类型不匹配。
我想(希望)您不是要在Pi上运行x86编译的应用程序。尽管Docker可用于两种处理器类型,但Docker不会在Pi上运行x86二进制文件,反之亦然。
实际上,AltArch当前表示以下体系结构之一... ppc64,ppc64le,i386,armhfp(ARM v7 32位),aarch64(arm v8 64位)。 Core建议使用CentOS的主流x86和x86_64版本。
是的,我敢打赌这就是事实……您不能只将x86二进制文件传输到Raspbian并期望它能工作。必须为平台重建该应用程序。