随着树莓派,并从我的电脑,我想交叉编译用C ++编写一个简单的HelloWorld。 我使用的代码的Sourcery工具链的Linux编译。
当复制了HelloWorld二进制通过TFTP到覆盆子,并给它使用chmod执行权限,出现下一个错误:
“非法指令”
如果做一个“文件”在二进制我得到:“覆盆子: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;
}
我怎么能编译和在一个正确的方式运行我的程序? 谢谢。
你为什么要得到理由Segmentation fault
错误是不同的ABI。 运行Raspbian使用时覆盆子裨linux-arm-gnueabihf
ABI其中假定在硬件hardfp和VFP支持(这是用于ARMv6环境罕见),因此需要用于GCC和EGLIBC一些额外的补丁(这些补丁可以在Raspbian储存库中找到)。
你的代码的Sourcery交叉工具链很可能不具备这些补丁,所以它使用另一个ABI( linux-arm-gnueabi
),因此在运行时崩溃(静态链接的作品,因为内核ABI不依赖于hardfp / softfp)。
另一个可能的原因,你可能会得到Illegal Instruction
错误代码的Sourcery交叉工具链配置对ARMv7和树莓派是ARMv6的。 但是,在这种情况下,静态和动态链接将产生同样的错误。
这里是一步一步的指导,如何建立树莓派交叉编译器在Windows中 ,这两个hardfp / softfp ABI版本。 得到的交编译器支持C ++和不依赖于cygwin的运行时库(cygwin1.dll)。
我建议你尝试比科德 ,它会自动设置交叉编译环境,为您和建设后发送生成的二进制文件的树莓
这个问题在我的FTP传输使用ASCII模式,而不是二进制模式。 今天,我更喜欢使用SFTP(SSH)。 谢谢。
你可以尝试工具链为: https://github.com/kallaballa/Raspberry-GCC-4.7.3
这是一个预构建GCC-4.7.3工具链使用gnueabi hardfp ARMv6的。 我用它来交叉编译的C ++ 11的raspberrian目标。
请注意,它只能在Linux x86_64的主机。
我的建议是在这里, http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/他做讲解如何使用Eclipse编译HelloWorld.cpp一份好工作,下载,和在树莓PI板执行它。 看看这个。
使用Visual Studio和Visual GDB插件,你可以下载树莓派交叉编译器。 之后,你可以创建一个SSH连接,你也可以远程部署程序到树莓派。