【发布时间】:2014-06-17 10:51:22
【问题描述】:
我有一个安装了 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 结合时采用的方法)
【问题讨论】:
标签: linux cross-compiling raspberry-pi crosstool-ng