为Raspberry Pi 进行交叉编译

13

我正在使用Raspberry Pi和我的计算机,尝试交叉编译一个简单的C++ helloWorld程序。我正在使用Code Sourcery Linux工具链进行编译。

当通过TFTP将helloWorld二进制文件复制到Raspberry上,并使用chmod命令给予其执行权限时,会出现"非法指令"的报错信息。

如果在链接时使用了"-static -static-libstdc++"参数,那么当对这个二进制文件执行"file"命令时,会显示以下信息:"raspberry: ELF 32-bit LSB可执行文件,ARM架构,版本1 (SYSV),静态链接,已剥离"

如果不使用静态链接,错误信息则变成:"分段错误"

代码:

/*
 * 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;
}

如何正确编译和运行我的程序? 谢谢。


3
是的,但在Raspberry上编译比在我的Core i5上编译要慢。但我也想用我心爱的Eclipse进行编程。 - Cesar Ortiz
2
如果在目标系统上构建整个工具链是必需的,那么下载/购买商业工具链有什么意义呢? - Cesar Ortiz
3
因为我使用了 ASCII 模式而不是二进制模式,将我的二进制文件通过 TFTP 传输到树莓派时出现了“分段错误”的问题。这是初学者常犯的错误。 - Cesar Ortiz
请参见https://dev59.com/UmIk5IYBdhLWcg3wke3M。 - Ross Rogers
1
@CesarOrtiz 我知道现在已经很晚了,但我就是忍不住要说!endl已经自带flush功能,所以你故意刷新两次。这就是为什么我更喜欢一开始就使用'\n'而不是endl的原因。 - BoBTFish
显示剩余4条评论
6个回答

8
你之所以会出现“分段错误(Segmentation fault)”的错误,是因为使用了不同的ABI。当Raspberry Pi运行Raspbian操作系统时,使用的是“linux-arm-gnueabihf” ABI,它假定硬件支持hardfp和VFP(在ARMv6环境中很少见),因此需要一些额外的GCC和EGLIBC补丁(这些补丁可以在Raspbian存储库中找到)。
你的Code Sourcery交叉工具链很可能没有这些补丁,因此它使用另一个ABI(“linux-arm-gnueabi”),因此在运行时会崩溃(静态链接有效,因为内核ABI不依赖于hardfp / softfp)。
你可能会出现“非法指令(Illegal Instruction)”错误的另一个可能原因是,Code Sourcery交叉工具链配置为ARMv7,而Raspberry Pi是ARMv6。但在这种情况下,静态链接和动态链接都会产生相同的错误。 这里有一个逐步指南,介绍如何在Windows上构建Raspberry Pi交叉编译器,包括hardfp / softfp ABI版本。生成的交叉编译器支持C ++,并且不依赖于cygwin运行时库(cygwin1.dll)。

3
我建议您尝试使用biicode,它会自动为您设置交叉编译环境,并在构建后将生成的二进制文件发送到树莓派。您可以访问biicode了解更多信息。

3

我的问题是在FTP传输中使用了ASCII模式而不是二进制模式。现在我更倾向于使用SFTP(SSH)。谢谢。


1
您可以尝试使用此工具链:https://github.com/kallaballa/Raspberry-GCC-4.7.3 这是一个预编译的gcc-4.7.3工具链,用于armv6硬件浮点运算,并使用gnueabi。我正在使用它来交叉编译c++11以用于树莓派目标。
请注意,它仅适用于linux x86_64主机。

1

0

使用Visual Studio和Visual GDB插件,您可以下载适用于树莓派的交叉编译器。之后,您可以创建SSH连接,并远程部署程序到树莓派。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接