使用Raspberry Pi和我的电脑,我正在尝试交叉编译一个简单的用C++编写的helloWorld。我正在使用 Linux 的代码源工具链进行编译。
当通过 TFTP 将 helloWorld 二进制文件复制到 Pi 并使用 chmod 授予其执行权限时,会出现下一个错误:
"非法指令"
如果我通过二进制制作一个"文件",我会得到: raspberry: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped
这是因为我在链接时使用了-static -static-libstdc++
。
如果我不使用静态链接,错误是:"分段错误"
守则:
#include <iostream>
using namespace std;
int main(void){
cout << "Hello Cross Compiling for ARM!" << endl << flush;
return 0;
}
如何以正确的方式编译和运行我的程序?
您收到Segmentation fault
错误的原因是不同的 ABI。运行Raspbian时,Raspberry Pi使用的是linux-arm-gnueabihf
ABI,它假设硬件支持hardfp和VFP(这在ARMv6环境中很少见),因此需要一些额外的GCC和EGLIBC补丁(这些补丁可以在Raspbian存储库中找到)。
您的代码源跨工具链很可能没有这些补丁,因此它使用另一个 ABI(linux-arm-gnueabi
),因此运行时崩溃(静态链接有效,因为内核 ABI 不依赖于 hardfp/softfp)。
您可能会收到错误Illegal Instruction
的另一个可能原因是为 ARMv7 配置的代码源跨工具链,而树莓派是 ARMv6。但在这种情况下,静态和动态链接都会产生相同的错误。
以下是如何在Windows中构建Raspberry Pi交叉编译器的分步指南,包括hardfp/softfp ABI版本。生成的交叉编译器支持C++并且不依赖于cygwin运行时库(cygwin1.dll)。
问题是在我的FTP传输中使用ASCII模式而不是二进制模式。今天我更喜欢使用SFTP(SSH)。谢谢。
我建议尝试biicode,它会自动为您设置交叉编译器环境,并在构建后将生成的二进制文件发送到树莓
您可以在以下位置尝试工具链: https://github.com/kallaballa/Raspberry-GCC-4.7.3
这是一个预构建的 gcc-4.7.3 工具链,用于使用 gnueabi 的 armv6 和 hardfp。我正在使用它来交叉编译 c++11 以获得一个 raspberrian 目标。
请注意,它仅适用于 linux x86_64 主机。
我的建议在这里,http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/他在解释如何使用Eclipse编译HelloWorld.cpp,下载并在Raspberry pi板中执行它方面做得很好。看看吧。
Studio和Visual GDB插件,您可以下载Raspberry Pi的交叉编译器。之后,您可以创建 ssh 连接,也可以将程序远程部署到树莓派中。