Ces*_*tiz 13 c++ cross-compiling codesourcery raspberry-pi
使用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;
}
Run Code Online (Sandbox Code Playgroud)
我怎么能以正确的方式编译和运行我的程序?谢谢.
你得到Segmentation fault错误的原因是ABI不同.运行Raspbian时的Raspberry Pi正在使用linux-arm-gnueabihfABI,它假设硬件支持hardfp和VFP(这在ARMv6环境中很少见),因此需要为GCC和EGLIBC提供一些额外的补丁(这些补丁可以在Raspbian存储库中找到).
您的Code Sourcery交叉工具链很可能没有这些补丁,因此它使用另一个ABI(linux-arm-gnueabi)因此在运行时崩溃(静态链接起作用,因为内核ABI不依赖于hardfp/softfp).
您可能遇到Illegal Instruction错误的另一个可能原因是为ARMv7配置的Code Sourcery交叉工具链和Raspberry Pi是ARMv6.但在这种情况下,静态和动态链接都会产生相同的错误.
以下是如何在Windows中构建Raspberry Pi交叉编译器的逐步指南,两者都是hardfp/softfp ABI版本.结果交叉编译器支持C++,不依赖于cygwin运行时库(cygwin1.dll).