【问题标题】:./app_name: cannot execute binary file: Exec format error./app_name:无法执行二进制文件:执行格式错误
【发布时间】:2020-09-04 10:03:52
【问题描述】:

我在我的 64 位 Ubuntu 机器上用 QT 编译了一个应用程序。我需要将该应用程序放在运行 32 位 Raspbian Stretch 的 Raspberry Pi 中。但是,当我使用命令./app_name 运行我的应用程序(app_name)时,它会输出cannot execute binary file: Exec format error。我在互联网上搜索,这是因为我在 64 位机器上编译了程序,所以它不能在 32 位上运行。这是唯一的情况还是我需要在与 raspbian 相同的架构中编译程序?或者,如果我下载 32 位版本的 Ubuntu 并在那里编译程序,然后将其传输到 Raspberry Pi,它会起作用吗?

【问题讨论】:

  • 你正在做的不是部署。编译后,你不能指望这个二进制文件在每个 linux 平台上都能工作。你需要部署它

标签: qt ubuntu raspberry-pi


【解决方案1】:

您需要使用面向与 Raspberry Pi 相同架构的编译器和链接器来构建程序。也就是说,它应该是特定 CPU(或至少是 CPU 范围)的编译器,支持相同的 ABI(应用程序二进制接口)和相同的位宽。

实际上,这意味着为您的 Ubuntu 机器获取和配置与 Pi 兼容的 ARM 工具链,或者在 Pi 本身上构建程序。如果您采用工具链方法,您可能必须获取应用程序使用的任何依赖项(库)的 Pi 版本。

Pi 的交叉编译是一项相当专业的任务,就像 ARM Android 的交叉编译(在某种程度上可以使用相同的工具)。

根据我的经验,在 Pi 上构建几乎总是更容易。安装编译器和构建工具通常是运行“apt-get”或类似的东西,并且您的应用程序需要的任何依赖项都已经具有正确的规范。现代 Pi 模型足够快,甚至可以在板上编译大量应用程序。除非您有特定的理由从其他系统进行交叉编译,否则在板载上构建通常更容易。

如果你真的需要交叉编译,使用一些包含完整工具链的 Docker 镜像可能会更容易——网络搜索应该会找到这些。从头开始组装完整的工具链,尤其是在您有复杂依赖项的情况下,是一项艰巨的任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多