2012-06-26 147 views
11

使用RaspBerry Pi和我的电脑,我试图交叉编译用C++编写的简单的helloWorld。我正在使用Code Sourcery工具链进行Linux编译。RaspBerry Pi的交叉编译

当复制了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; 
} 

我怎么能编译并以正确的方式运行我的程序? 谢谢。

+0

请张贴的Hello World源,如果你的二进制拆卸后发送生成的二进制文件的树莓。 –

+0

我认为RaspberryPi的好处之一是它运行的是完整的操作系统,不需要交叉编译。 –

+1

是的,但在Raspberry上编译比在Core i5中编译要慢。但我也想用我喜爱的Eclipse进行编程。 –

回答

16

This page告诉你在深度如何为您的树莓派一个交叉编译环境。祝你好运!

+0

谢谢。 crosstools-ng对我来说工作正常。 –

+0

@CesarOrtiz如果这个工作,你应该接受这个答案。 – TheLukeMcCarthy

6

你之所以得到Segmentation fault错误是不同的ABI。 Raspberry Pi在运行Raspbian时使用的是linux-arm-gnueabihf ABI,它假定在硬件上支持hardfp和VFP支持(这在ARMv6环境中很少见),因此需要一些用于GCC和EGLIBC的补丁(这些补丁可以在Raspbian存储库中找到)。你的代码Sourcery交叉工具链很可能没有这些补丁,所以它使用另一个ABI(linux-arm-gnueabi),因此运行时崩溃(因为内核ABI不依赖于hardfp/softfp,静态链接工作)。

为什么你可能会得到Illegal Instruction错误的另一个可能原因是为ARMv7配置了Code Sourcery交叉工具链,而Raspberry Pi是ARMv6。但是在这种情况下,静态链接和动态链接都会产生相同的错误。

Here is a step-by-step guide how to build Raspberry Pi cross compiler in Windows,都是hardfp/softfp ABI版本。由此产生的交叉编译器支持C++,并且不依赖于cygwin运行时库(cygwin1.dll)。

0

问题是在我的FTP传输中使用ASCII模式而不是二进制模式。 今天我更喜欢使用SFTP(SSH)。 谢谢。

0

使用Visual Studio和Visual GDB插件,您可以下载树莓派的交叉编译器。之后,您可以创建一个ssh连接,也可以将您的程序远程部署到树莓派中。

3

我建议你尝试biicode,它会自动设置交叉编译环境,为您和建设

+0

链接已关闭。 – Hannes

+0

修复了,谢谢告诉 – hithwen