How do I prepare a Raspberry Pi with Raspbian so I can cross compile Qt5 programs from a Linux host?

时间:2015-05-08 09:52:10

标签: raspberry-pi cross-platform raspbian

I want to setup a cross compile environment on Linux for the Raspberry Pi 1. Especially I want to try bleeding edge version, i.e. Raspbian testing + Qt5 dev branch.

This question: How can I create a modern cross compile toolchain for the Raspberry Pi 1?

...explains how to get a gcc compiler, which can create code for the Raspberry Pi 1. Are there changes necessary on Raspbian itself to use it? If so, which ones?

2 个答案:

答案 0 :(得分:4)

您需要一个完整的工具链

工具链是一组协同工作以为系统生成二进制文件的工具。根据您构建工具链的方式,它可能最终只能用于您的自己的图像,这不是,实际上是一个问题,您只需克隆您的图像并随意升级它。

首先,了解您的需求:

  • 功能旗舰系统。这是您的参考板和参考发行包,您的包和您的东西。你可能想要一个标准的Raspbian,或者你可能想要一些额外的东西,比如OpenCV或更少的东西,如删除Xorg。你说你想要出血,所以要适合你的口味。
  • SYSROOT 即可。理想情况下,这是功能旗舰系统的副本,带有增加的开发标题。在我的情况下,它完全相同,对于Raspbian,这是您的第二个分区的图像,即承载 / 的分区。
  • 交叉编译器。这是一个在x86或x86_64上运行时为ARM生成代码的编译器。这通常是专门的 gcc
  • 交叉编译qmake 。对于Qt,你需要一个交叉qmake,这是一个qmake,它将生成Qt二进制文件,并使用你生成arm Qt软件所需的东西。
  • ARM Qt库。这是您的功能旗舰系统的一部分,为了清楚起见,我在这里列举它。它们将由您使用sysroot和交叉编译器编译。
  • 用于交叉编译的Qt库。这是生成交叉编译qmake和ARM Qt库时将遵循的步骤的乘积。这将安装在您的主机x86系统中。

那你怎么得到这一切呢?

收集你自己的工具链

  • 功能旗舰系统(FFF)。只需获取您的raspbian图像并随意安装其他软件,无论您想要什么,只需将其安装在实时的Raspberry上即可。
  • SYSROOT 即可。获得FFF后,使用dd生成第二个raspbian分区的图像。关闭您的卡,将其插入x86系统并使用dd。还有其他使用mount和offsets的方法,但这要简单得多。
  • 交叉编译器。除非你真的知道自己在做什么,否则不要自己创造它。 There are functional cross compilers
  • 用于交叉编译的Qmake,ARM Qt和Qt库。这是有趣的部分......

交叉编译Qt 5

当你从git获得它时,你可以随心所欲地使用Qt。由于这不是一个真正的Wiki,我将只列举这些步骤。 This guide explains it with a lot more detail

  1. 让您的FFF,图像和交叉编译器正常工作。
  2. git clone 你的Qt,选择一个标签(版本)
  3. 安装您的sysroot
  4. 如果您使用的是x64
  5. ,请获取ia32-libs
  6. 编译 qtbase ,然后 make install 重要:获得qtbase后,它会从现在开始生成自己的qmake,使用
  7. 使用qtbase中生成并安装的qmake构建您想要的任何其他Qt模块。
  8. 请记住在您构建的所有Qt模块上使用make install。所有这些“安装”都会将这些二进制文件复制到 sysroot
  9. 让你的Qt进入你的FFF。您可以复制文件夹并避免弄乱权限,也可以更轻松地卸载您的sysroot,然后使用dd将修改后的图像转储到您从中获取的相同物理分区。这些是 ARM Qt Libraries
  10. 构建qtbase时,它会将一些内容安装到您自己的x86系统中。这是 Qmake for cross compiling ,将它用于Qt Creator以生成交叉编译的二进制文件和交叉编译器。
  11. 有人注意到没有人告诉你

    • 似乎没有可供下载的工具链。这是因为它们在很大程度上取决于您的具体设置。
    • 请勿使用系统或常规 qmake 进行交叉编译。使用您生成的qmake,因为它与您的FFF非常吻合,它有路径和其他特定的东西。
    • 我再说一遍,不要打扰创建交叉编译器
    • 如果您需要其他开发文件怎么办?将它们安装在您的FFF上,然后复制您的分区以获得新的sysroot。
    • 是的,您可以使用Qt自动部署,甚至可以在现场Pi上远程调试。

答案 1 :(得分:2)

安装前沿开发系统/工具链有点问题......它是一个移动目标。以下步骤对我来说确实适用于2015年3月。如果他们仍然100%工作或他们将工作多久......但如果一个人已经阅读并理解了下面的“walktrough”,那么为将来的Raspian调整过程应该不难Qt5版本。

拳头步骤应该是更新Raspian。我升级到测试。为此,请将/etc/apt/sources.list中的存储库更改为:

  

deb http://mirrordirector.raspbian.org/raspbian/测试主要贡献   非自由rpi

接下来是通常的'apt-get update,apt-get upgrade,apt-get dist-upgrade'。或模拟能力指令。在此步骤之后,已升级到最新的Raspian。具有测试版本的所有风险和好处。

接下来需要安装几个软件包。可能并非全部必要,例如xcb不适用于RPi,而RPi也有自己的一组opengl文件。但是一些Raspian包不知道这个并且可能会把它们拉进去。下面的包允许使用QMultimedia和

编译Qt5
apt-get install -y "^libxcb.*" libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libicu-dev libxslt1-dev 
apt-get install -y libssl-dev libxcursor-dev libxrandr-dev libfontconfig1-dev libcap-dev libbz2-dev libgcrypt11-dev 
apt-get install -y libpci-dev libnss3-dev libxtst-dev libasound2-dev libcups2-dev libpulse-dev libudev-dev 
apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libproxy-dev libmtdev-dev libts-dev  
apt-get install -y libxkbcommon-x11-dev libxkbcommon-dev libinput-dev libgbm-dev libjpeg8-dev  libgif-dev libopenjpeg-dev 
apt-get install -y libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev sqlite3 libsqlite3-dev libwayland-dev 
apt-get install -y libdirectfb-dev libegl1-mesa-dev  libsystemd-journal-dev libharfbuzz-dev xutils-dev libcairo2-dev
apt-get install -y libffi-dev libpam0g-dev

下一步也是最重要的一步也是最不愉快的一步。 Raspian中的几个库是具有绝对路径的符号链接。这很糟糕,因为在编译Qt5时,后来找不到这些库。必须将相关库的所有符号链接转换为具有相对路径的符号链接。在谷歌的帮助下,可以找到一个脚本,这几乎是自动完成的,但由于某些原因它对我不起作用。因此我手动完成。如果我必须经常这样做,我当然会写自己的。这也是最有可能破解的步骤。库版本更改...所以不要盲目地复制/粘贴下面的命令。

下面并不是所有的lib都需要编译Qt5,但最终它们都可能是个问题。完成此步骤后,Raspberry Pi即可使用。下一步是编译并安装Qt5。

编辑:编写这样一个小型教程的副作用之一:人们再次思考一些人做过的事情。将绝对链接转换为相对链接有一种更简单的方法:符号链接。

所以:

  

apt-get install symlinks

然后在Raspberry Pi上的/ usr / lib /中:

  

符号链接-cr。