如何交叉编译ARM架构的程序?

如何为ARM处理器设置GCC进行交叉编译?主机将是x86_64(AMD64 - Ubuntu 12.04),目标将是ARM(包括Raspberry Pi和Pandaboard - 将为每个设备进行单独的编译)?
2个回答

安装gcc-arm-linux-gnueabibinutils-arm-linux-gnueabi软件包,然后在编译时使用arm-linux-gnueabi-gcc代替gcc
在目标系统上,您需要注意Linux的版本和binutils的类型。最新的是hardfloat,这种情况下您需要执行以下操作:
sudo apt-get install gcc-arm-linux-gnueabihf

这将引入完整的交叉编译环境,包括binutils。
在构建过程中使用这个GCC,请写入:
CC=arm-linux-gnueabihf-gcc make

在Ubuntu 13.10上,你可以得到'gnueabi'的gcc-4.7和'gnueabihf'的gcc-4.8。 - Brent Bradburn
当我尝试编译时,虽然我已经安装了libssl-dev,但是出现了找不到openssl/ossl_typ.h的错误。 - Necktwi
1如果你从apt-get source获取源代码,在apt-get build-dep之后,你通常只需要用dpkg-buildpackage -b -uc -us -r进行编译。 是否有一种在不更改makefile的情况下轻松构建ARM的.deb包的方法? - Jonathan
@Maratyszcza,你能对and then just use arm-linux-gnueabi-gcc instead of gcc for compilation这一行的执行方法更具体一些吗?当我编译时,我使用了make命令调用,据我所知,它自然会指向/usr/lib/gcc或类似的路径。我应该如何直接调用arm-linux-gnueabi-gcc呢? - Momergil
10@Momergil CC=arm-linux-gnueabihf-gcc make ... - Maratyszcza

64位ARM

对于64位ARM,工具链前缀为aarch64,使用方法如下:

sudo apt install gcc-9-aarch64-linux-gnu
aarch64-linux-gnu-gcc -o main.out main.c

你可以在这个使用QEMU的C hello world程序上试试看。

main.c

#include <stdio.h>

int main(void) {
    puts("hello");
}

然后:
sudo apt install qemu-user
qemu-aarch64 main.out

将输出:

hello

然后,有一些有趣的事情可以让你快速看到ARM实际上是在底层运行:

在Ubuntu 19.10中测试通过。

对于严肃应用程序的可靠性,磁盘映像提供者还必须提供兼容的交叉编译器

虽然你可以方便地使用apt安装交叉编译器,但我必须警告你,除非显式支持映像提供者,否则这并不一定可靠。

如果选择了错误的交叉编译器,可能会发生以下情况:

树莓派交叉编译

对于树莓派(RPI)而言,可以在https://github.com/raspberrypi/tools找到提供的交叉编译器,并按照https://raspberrypi.stackexchange.com/questions/64273/installing-raspberry-pi-cross-compiler/83215#83215中的说明进行使用。
git clone https://github.com/raspberrypi/tools
export PATH="$(pwd)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:${PATH}"
printf '#include <stdio.h>\nint main() { puts("hello world"); }\n' > hello_world.c
printf '#include <iostream>\nint main() { std::cout << "hello world" << std::endl; }\n' > hello_world.cpp
arm-linux-gnueabihf-gcc -std=c99 -o hello_world_c hello_world.c
arm-linux-gnueabihf-g++ -std=c++11 -o hello_world_cpp hello_world.cpp

Ubuntu交叉编译

如果你想要为Ubuntu arm64进行交叉编译,我从未找到过明确的参考资料,说明哪些交叉编译器支持哪个发行版版本:Ubuntu服务器备选架构(如ARM)的官方支持的交叉编译器有哪些?

Buildroot

我最喜欢的替代方法是使用Buildroot构建自己的镜像:https://stackoverflow.com/questions/47557262/how-to-download-the-torvalds-linux-kernel-master-recompile-it-and-boot-it-wi/49349237#49349237

这将从源代码构建所有内容,包括工具链和镜像,并确保一切兼容。


我还需要额外安装aarch64-linux-gnu-gcc(没有指定gcc版本)。 - undefined