我有一个自编程序,我想从我的x86机器上为Raspberry Pi构建。我使用eclipse生成的makefile并不能改变这个东西。
我已经阅读了本教程的CC for raspi:Hackaday-Link。因为raspi也安装了gcc版本4.9,我也尝试使用这个版本的交叉编译器。问题也存在于这个问候世界计划中:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout << "hello world!" << endl;
}
直接在raspi上编译并运行它时,输出为hello world!
。好没关系。
但是当用arm-linux-gnueabihf-g++-4.9
的4.9版进行交叉编译时,然后将其scp到raspi,使其可执行并运行它,./hello_world
的输出为Segmentation fault
。执行sudo ./hello_world
时没有输出。
我试图获取有关这些文件的一些信息,并看到本地上的raspi编译程序输出了:
pi@raspberrypi:~ $ file hello_world
hello_world: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=41161ae762d940b12c3313ca065a3badd284f6d3, not stripped
和交叉编译版本输出
pi@raspberrypi:~ $ file hello_world
hello_world: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=4f1f4fb86710ef8130f148dc5adae1c0c18092fd, not stripped
谁能告诉我问题是什么以及如何解决?
答案 0 :(得分:1)
工具链编译器arm-linux-gnueabihf-gcc可以有不同的默认参数,可以运行:
arm-linux-gnueabihf-gcc -Q --help=target
Raspberry Stretch上安装的编译器(我将仅保留基本信息):
-march= armv6
-marm [enabled]
-mfloat-abi= hard
-mfp16-format= none
-mfpu= vfp
Stretch默认交叉编译器:
-march= armv7-a
-marm [disabled]
-mfloat-abi= hard
-mfp16-format= none
-mfpu= vfpv3-d16
现在你看到了架构的不同之处。因此,对于使用交叉编译器的sompile,需要设置march
以匹配您想要的CPU。
另请注意,Debian交叉编译器默认发出Thumb代码,Raspberry Stretch发出ARM代码
我建议您在较新的CPU系列中进行交叉编译,而您的设备不支持它。