使用RaspBerry Pi和我的计算机,我正在尝试交叉编译一个用C ++编写的简单helloWorld。我正在使用Code Sourcery工具链进行linux编译。
当TFTP将helloWorld二进制文件复制到raspBerry并使用chmod赋予它执行权限时,会出现下一个错误:
“非法指令”
如果在二进制文件上创建'文件',我会得到: “raspberry:ELF 32位LSB可执行文件,ARM,版本1(SYSV),静态链接,剥离”
这是因为我在链接时使用了“-static -static-libstdc ++”。
如果我不使用静态链接,则错误是: “分段错误”
守则:
/*
* main.cpp
*
* Created on: 26/06/2012
* Author: ccortiz
*/
#include <iostream>
using namespace std;
int main(void){
cout << "Hello Cross Compilling for ARM!" << endl << flush;
return 0;
}
我怎样才能以正确的方式编译和运行我的程序? 感谢。
答案 0 :(得分:7)
您收到Segmentation fault
错误的原因是ABI不同。运行Raspbian时使用的Raspberry Pi正在使用linux-arm-gnueabihf
ABI,它假设硬件支持hardfp和VFP(这在ARMv6环境中很少见),因此需要为GCC和EGLIBC提供一些额外的补丁(这些补丁可以在Raspbian存储库中找到)。 / p>
您的Code Sourcery交叉工具链很可能没有这些补丁,因此它使用另一个ABI(linux-arm-gnueabi
)因此在运行时崩溃(静态链接起作用,因为内核ABI不依赖于hardfp / softfp)。
您可能遇到Illegal Instruction
错误的另一个可能原因是为ARMv7和Raspberry Pi配置的Code Sourcery交叉工具链是ARMv6。但在这种情况下,静态和动态链接都会产生相同的错误。
Here is a step-by-step guide how to build Raspberry Pi cross compiler in Windows,两个hardfp / softfp ABI版本。结果交叉编译器支持C ++,不依赖于cygwin运行时库(cygwin1.dll)。
答案 1 :(得分:3)
我建议尝试biicode,它会自动为您设置交叉编译环境,并在构建后将生成的二进制文件发送到树莓上
答案 2 :(得分:2)
问题是在我的FTP传输中使用ASCII模式而不是二进制模式。 今天我更喜欢使用SFTP(SSH)。 感谢。
答案 3 :(得分:1)
您可以在https://github.com/kallaballa/Raspberry-GCC-4.7.3
尝试工具链它是armv6的预制gcc-4.7.3工具链,使用gnueabi进行hardfp。我正在使用它来交叉编译c ++ 11以获得一个raspberrian目标。
请注意,它仅适用于linux x86_64主机。
答案 4 :(得分:1)
我的推荐是http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/ 他在解释如何使用Eclipse编译HelloWorld.cpp,下载并在Raspberry pi板中执行它方面做得很好。看看吧。
答案 5 :(得分:0)
使用Visual Studio和Visual GDB插件,您可以下载用于raspberry pi的交叉编译器。之后,您可以创建一个ssh连接,也可以将程序远程部署到raspberry pi。