13

使用 RaspBerry Pi 和我的计算机,我正在尝试交叉编译一个用 C++ 编写的简单 helloWorld。我正在使用适用于 linux 的 Code Sourcery 工具链进行编译。

当通过 TFTP 将 helloWorld 二进制文件复制到 raspBerry 并使用 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;
}

我怎样才能以正确的方式编译和运行我的程序?谢谢。

4

6 回答 6

8

您收到错误的原因Segmentation fault是不同的 ABI。Raspberry Pi 在运行 Raspbian 时使用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)。

于 2012-09-26T08:15:06.483 回答
3

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

于 2012-10-18T14:05:31.983 回答
3

我建议尝试biicode,它会自动为您设置交叉编译器环境,并在构建后将生成的二进制文件发送到树莓派

于 2014-01-20T13:59:06.783 回答
1

您可以在以下位置尝试工具链:https ://github.com/kallaballa/Raspberry-GCC-4.7.3

这是一个使用 gnueabi 的带有 hardfp 的 armv6 的预构建 gcc-4.7.3 工具链。我正在使用它为树莓派目标交叉编译 c++11。

请注意,它仅适用于 linux x86_64 主机。

于 2012-12-21T11:47:06.720 回答
1

我的推荐在这里,http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/ 他很好地解释了如何使用Eclipse编译HelloWorld.cpp,下载,并在树莓派板上执行。一探究竟。

于 2013-02-26T05:30:18.577 回答
0

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

于 2013-12-05T04:49:15.650 回答