如何准备 Raspberry Pi 和 Raspbian 以便我可以从 Linux 主机交叉编译 Qt5 程序?

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

我想在 Linux 上为 Raspberry Pi 1 设置一个交叉编译环境。 特别是我想尝试前沿版本,即 Raspbian testing + Qt5 dev branch。

本题:

...解释如何获得 gcc 编译器,它可以为 Raspberry Pi 创建代码 1. Raspbian 本身是否需要更改才能使用它?如果有,是哪些?

安装前沿开发system/toolchain有点问题...它是一个移动的目标。以下步骤在 2015 年 3 月对我有用。如果他们仍然 100% 工作或他们将工作多长时间......但是如果一个人已经阅读并理解以下内容 'walktrough' 调整流程以备将来使用应该不难Raspian 或 Qt5 版本。

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

deb http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi

后面是通常的'apt-get update, apt-get upgrade, apt-get dist-upgrade'。或者模拟 aptitude 命令。在这一步之后,一个已经升级到最新的 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 时找不到这些库。相关库的所有符号链接都必须转换为具有相对路径的符号链接。在 Google 的帮助下,可以找到一个脚本,它几乎是自动完成的,但出于某种原因,它对我不起作用。因此我手动完成了。如果我必须更频繁地这样做,我当然会自己写。这也是最容易坏掉的一步。库版本变化...所以不要盲目地 copy/paste 下面的命令。

并非下面所有的库都是编译 Qt5 所必需的,但它们最终都可能成为问题。完成此步骤后,Raspberry Pi 就可以使用了。接下来就是编译安装Qt5了。

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

所以:

apt-get install symlinks

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

symlinks -cr .

您需要一个完整的工具链

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

首先,了解你需要什么:

  • 功能旗舰系统。这是你的参考板和你的参考发行包,你的包和你的东西。你可能想要一个标准的 Raspbian 或者你可能想要一些额外的东西,比如 OpenCV 或者更少的东西,比如删除 Xorg。你说你想要最前沿的,所以符合你的口味。
  • Sysroot。理想情况下,这是您的功能性旗舰系统的副本,并添加了开发 headers。在我的例子中,它完全一样,因为 Raspbian 这是你的第二个分区的映像,即托管 /.
  • 的分区
  • 交叉编译器。这是一个为 ARM 生成代码的编译器,而在 x86 或 x86_64 上 运行。这通常是专门的 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。还有其他使用挂载和偏移量的方法,但这要简单得多。
  • 交叉编译器。除非你真的知道自己在做什么,否则不要自己创造。 There are functional cross compilers.
  • 用于交叉编译的 Qmake、ARM Qt 和 Qt 库。这是有趣的部分...

交叉编译Qt 5

您可以随心所欲地使用 Qt,就像您从 git 获得的一样。由于这不是真正的 Wiki,我将仅列举步骤。 This guide explains it with a lot more detail.

  1. 让您的 FFF、图像和交叉编译器正常工作。
  2. git克隆你的Qt,选择一个标签(版本)
  3. 挂载你的 sysroot
  4. 如果您使用的是 x64,请获取 ia32-libs
  5. 编译qtbase然后安装重要提示:获得 qtbase 后,它会生成自己的 qmake,从现在开始使用它
  6. 使用从 qtbase 生成和安装的 qmake 来构建您想要的任何其他 Qt 模块。
  7. 请记住在您构建的所有 Qt 模块上使用 make install。所有这些 'installs' 会将这些二进制文件复制到您的 sysroot.
  8. 让您的 Qt 进入您的 FFF。您要么复制该文件夹并避免弄乱权限,要么更轻松地卸载您的 sysroot,然后使用 dd 将修改后的映像转储到您从中获取它的同一物理分区。这些是 ARM Qt 库
  9. 构建 qtbase 时,它​​会将一些东西安装到您自己的 x86 系统中。这是 用于交叉编译的 Qmake,将其用于 Qt Creator 以与您的交叉编译器一起生成交叉编译的二进制文件。

有些笔记没人告诉你

  • 似乎没有可供下载的工具链。这是因为它们在很大程度上取决于您的特定设置。
  • 不要使用系统或常规qmake交叉编译。使用您生成的 qmake,因为它非常适合您的 FFF,它包含路径和其他特定内容。
  • 我再说一遍,不要费心创建你的交叉编译器
  • 如果您需要额外的开发文件怎么办?在您的 FFF 上安装它们,然后复制您的分区以获得新的 sysroot。
  • 是的,您可以 auto-deploy 使用 Qt,甚至可以在实时 Pi 上进行远程调试。