我有一个安装了 Emdebian 的 Raspberry PI,并且想要交叉编译项目。
有大量关于如何获取工具链并使用它构建简单项目的文档。我自己设法用 crosstool-ng 构建了一个工具链,并编写了一个运行良好的 hello world 程序。
我没有得到的是如何处理交叉编译更复杂的项目,如 Qt,这些项目依赖于其他库。让我们以libdbus为例,因为这是 Qt 的依赖项之一。
安装的 Emdebian 已经包含 libdbus.so,所以我自然更喜欢使用它,而不是交叉编译我自己的 libdbus.so,因为编译所有 Qt 的依赖项会花费很多时间。
据我了解,对于交叉编译,有两个重要的目录:
- “ staging”目录,所有已安装的库和应用程序都位于其中。这最初是工具链的 sysroot 目录的副本,并在交叉编译时填充了更多库。
- “ rootfs”目录,相当于设备上的目录——本质上是暂存目录的副本,没有文档和头文件等不需要的东西。据我了解,最好的方法是将所需文件从暂存目录复制到 rootfs。
获取 rootfs 目录很容易,因为它可以是来自设备的 NFS 挂载。但是,我如何获得 PI 上现有 Emdebian 安装的暂存目录?暂存目录需要包含诸如 dbus 标头之类的内容,这些内容未安装在 rootfs 上。
有些人只需在设备上安装 dbus 头文件,使用apt-get install libdbus-dev,然后使用 rootfs 作为暂存目录。使用此设置,rootfs 和 staging 之间不再有区别,缺点是 rootfs 被标头、文档等污染。优点当然是简单。
将 dbus 标头放入主机上的暂存目录的最佳方法是什么?人们在这种情况下使用的通常方法是什么?
作为一个附带问题,为什么获取工具链、编译程序然后将其复制到目标上的方法完全有效?工具链提供了自己的 libc、libstdc++ 等版本,它们与目标上安装的版本不兼容吗?特别是在使用使用 crosstool-ng 编译的自定义工具链创建时?
(请注意,我不是在问如何编译 Qt,我可以自己弄清楚。我的问题更笼统,关于将自定义工具链与现有安装/rootfs 组合时采用的方法)