如何为ARM处理器设置GCC进行交叉编译?主机将是x86_64(AMD64 - Ubuntu 12.04),目标将是ARM(包括Raspberry Pi和Pandaboard - 将为每个设备进行单独的编译)?
gcc-arm-linux-gnueabi
和binutils-arm-linux-gnueabi
软件包,然后在编译时使用arm-linux-gnueabi-gcc
代替gcc
。sudo apt-get install gcc-arm-linux-gnueabihf
CC=arm-linux-gnueabihf-gcc make
64位ARM
对于64位ARM,工具链前缀为aarch64
,使用方法如下:
sudo apt install gcc-9-aarch64-linux-gnu
aarch64-linux-gnu-gcc -o main.out main.c
main.c
#include <stdio.h>
int main(void) {
puts("hello");
}
sudo apt install qemu-user
qemu-aarch64 main.out
将输出:
hello
然后,有一些有趣的事情可以让你快速看到ARM实际上是在底层运行:
qemu-aarch64 -d in_asm,out_asm main.out
https://stackoverflow.com/questions/13005303/how-does-native-android-code-written-for-arm-run-on-x86/44505097#44505097在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
libssl-dev
,但是出现了找不到openssl/ossl_typ.h
的错误。 - Necktwiapt-get source
获取源代码,在apt-get build-dep
之后,你通常只需要用dpkg-buildpackage -b -uc -us -r
进行编译。 是否有一种在不更改makefile的情况下轻松构建ARM的.deb包的方法? - Jonathanand then just use arm-linux-gnueabi-gcc instead of gcc for compilation
这一行的执行方法更具体一些吗?当我编译时,我使用了make
命令调用,据我所知,它自然会指向/usr/lib/gcc
或类似的路径。我应该如何直接调用arm-linux-gnueabi-gcc呢? - MomergilCC=arm-linux-gnueabihf-gcc make ...
- Maratyszcza