【问题标题】:"Illegal instruction" when trying to run cross-compiled Qt on Raspberry Pi (Windows)尝试在 Raspberry Pi (Windows) 上运行交叉编译的 Qt 时出现“非法指令”
【发布时间】:2016-07-17 12:35:07
【问题描述】:

我找到并阅读了question here,还有线程herehere,不幸的是它仍然没有解决。 (尽管我使用了该线程中的所有提示来提供尽可能多的信息)


有什么问题

几天来,我一直在尝试找到一种能够交叉编译 Qt 的方法,因为我最近得到了一个,现在想学习如何编写一些基本的嵌入式应用程序。

我正在学习这里的教程: http://visualgdb.com/tutorials/raspberry/qt/embedded/

  • 我使用了一个干净的系统,我唯一需要安装的是一些依赖项:apt-get install libudev-dev libinput-dev libts-dev libxcb*(第一次运行它,configure 说缺少 库)
  • 分别从here2015-11-21-raspbian-jessieraspberry-gcc-4.9.2-r2.exe 获得 Raspbian 图像和工具链
  • Qt源码也来源于上面教程中的链接(qt-everywhere-opensource-src-5.5.0.tar.xz
  • 我使用了相同的文件路径等,所以所有命令都应该没问题,包括配置:../qt-everywhere-opensource-src-5.5.0/configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi2-g++ -sysroot C:/SysGCC/Raspberry/arm-linux-gnueabihf/sysroot -prefix /usr/local/qt5 -device-option CROSS_COMPILE=C:/SysGCC/Raspberry/bin/arm-linux-gnueabihf- -qt-xcb

几个小时后,一切都构建好了,大概没有错误。 (我的输出与教程中的屏幕截图不太一样)

但是,尝试运行任何已构建的示例,只会产生一行: Illegal instruction


我还能提供什么...

  • the thread I mentioned at the beginning 之后,这是file 的输出:

    root@raspberrypi:/usr/local/qt5/examples/opengl/cube# file cube
    
    cube: 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]=e4c51318d4ca583ace647510c9b4cddd06a34e19, stripped
    
  • 我尝试使用gdb ./cuberun 运行带有gdb 的应用程序。输出是:

    (gdb) run
    Starting program: /usr/local/qt5/examples/opengl/cube/cube 
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1".
    
    Program received signal SIGILL, Illegal instruction.
    0xb6249734 in QMutex::lock() () from /usr/local/qt5/lib/libQt5Core.so.5
    (gdb) Quit
    
  • 编译器本身作为交叉编译器工作 - 我能够在 Windows 上构建 C++ Hello World,使用 C:\SysGCC\Raspberry\bin\arm-linux-gnueabihf-g++.exe 编译,然后在 Raspberry 上运行它

  • 我什至能够正确配置 Qt Creator,使用 arm-linux-gnueabihf-g++.exe 作为编译器和 C:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5\bin\qmake.exe 作为 qmake - 基本的 opengl 项目构建良好,甚至可以远程部署到raspi 工作:) ...可惜“非法指令”

  • Raspbian:Linux raspberrypi 4.1.19+ #858 Tue Mar 15 15:52:03 GMT 2016 armv6l GNU/Linux

    root@raspberrypi:/# lsb_release -a
    No LSB modules are available.
    Distributor ID: Raspbian
    Description: Raspbian GNU/Linux 8.0 (jessie)
    Release: 8.0
    Codename: jessie
    
  • Windows 7 64 位


提前感谢您的帮助。当然,如果需要,我会提供任何必要的信息。

说真的,我尝试了一周,已经在 wiki.qt.io wiki.qt.io 上使用类似 linux 的东西失败了 不过,我真的很期待做出一个健壮的交叉编译,远程部署 Qt 环境,以便将来在 Windows 上在我的 Raspberry 上开发 :)

【问题讨论】:

  • 嘿,如果您找到解决方案,请随时联系我们,我在这里使用本教程从 Linux 交叉编译:wiki.qt.io/RaspberryPi2EGLFS
  • 您可以尝试在您的 raspi 上运行 raspi-config,然后“高级选项”->“GL 驱动程序”。我无法启用 GL 驱动程序,因为设备不支持它,这导致我检查板上印制的版本号。 RasPi 1 B+ v1.2 在这里不起作用。插入我的另一个 raspi (2 B v1.1) 工作正常。好吧,当我运行“qopenglwidget”示例时,什么都没有发生,但是“非法指令”已经消失了。因此,这项工作可能是错误的 RasPi。

标签: c++ qt raspberry-pi cross-compiling toolchain


【解决方案1】:

好吧,事实证明这是令人尴尬的明显。这里的教程:http://visualgdb.com/tutorials/raspberry/qt/embedded/ 是为 Raspberry Pi 2 制作的,虽然 没有明确提及

幸运的是,您只需将配置脚本从 -device linux-rasp-pi2-g++ 更改为 -device linux-rasp-pi-g++

我很惊讶,但显然它对我来说非常有效。

所以现在配置行应该是这样的:

../qt-everywhere-opensource-src-5.5.0/configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi-g++ -sysroot C:/SysGCC/Raspberry/arm-linux-gnueabihf/sysroot -prefix /usr/local/qt5 -device-option CROSS_COMPILE=C:/SysGCC/Raspberry/bin/arm-linux-gnueabihf- -qt-xcb

感谢 @Bugfinger 的提示 :)

PS。如果您不知道您拥有哪个版本的 RPi(我完全不确定),您可以比较规格和外围设备 herehere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2020-12-23
    • 2012-06-28
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多