交叉编译的树莓派(Cross-Compiling for RaspBerry Pi)

2019-07-30 03:31发布

随着树莓派,并从我的电脑,我想交叉编译用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;
}

我怎么能编译和在一个正确的方式运行我的程序? 谢谢。

Answer 1:

你为什么要得到理由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)。



Answer 2:

我建议你尝试比科德 ,它会自动设置交叉编译环境,为您和建设后发送生成的二进制文件的树莓



Answer 3:

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



Answer 4:

你可以尝试工具链为: https://github.com/kallaballa/Raspberry-GCC-4.7.3

这是一个预构建GCC-4.7.3工具链使用gnueabi hardfp ARMv6的。 我用它来交叉编译的C ++ 11的raspberrian目标。

请注意,它只能在Linux x86_64的主机。



Answer 5:

我的建议是在这里, http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/他做讲解如何使用Eclipse编译HelloWorld.cpp一份好工作,下载,和在树莓PI板执行它。 看看这个。



Answer 6:

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



文章来源: Cross-Compiling for RaspBerry Pi