我在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相同。也就是说,它应该是特定CPU(或者至少是CPU范围(的编译器,支持相同的ABI(应用程序二进制接口(和相同的位宽。
在实践中,这意味着为Ubuntu机器获取和配置与Pi兼容的ARM工具链,或者在Pi本身上构建程序。如果采用工具链方法,您可能需要获得应用程序使用的任何依赖项(库(的Pi版本。
Pi的交叉编译是一项相当专业的任务,就像ARM Android的交叉编译一样(在某种程度上可以使用相同的工具(。
根据我的经验,在圆周率上构建几乎总是更容易。安装编译器和构建工具通常是运行"编译"程序的问题;apt-get;或者类似的东西,并且您的应用程序所需的任何依赖项都将是正确的规范。现代Pi模型的速度足够快,甚至可以在板上编译大量的应用程序。除非您有特定的理由从其他系统交叉编译,否则在板上构建通常更容易。
如果你真的必须交叉编译,那么使用一些包含完整工具链的Docker镜像可能会更容易——网络搜索应该会找到这些。从头开始组装完整的工具链,特别是如果您有复杂的依赖关系,这是一项不平凡的任务。