【问题标题】:Combining existing rootfs with custom toolchain将现有的 rootfs 与自定义工具链相结合
【发布时间】:2014-06-17 10:51:22
【问题描述】:

我有一个安装了 Emdebian 的 Raspberry PI,并且想要交叉编译项目。

有很多关于如何获取工具链并使用它构建简单项目的文档。我自己设法用 crosstool-ng 构建了一个工具链,并编写了一个运行良好的 hello world 程序。

我不明白如何处理交叉编译更复杂的项目,如 Qt,这些项目依赖于其他库。让我们以 libdbus 为例,因为这是 Qt 的依赖项之一。

安装的 Emdebian 已经包含 libdbus.so,所以我自然更喜欢使用它,而不是交叉编译我自己的 libdbus.so,因为编译所有 Qt 的依赖项会花费很多时间。

对于交叉编译,据我了解有两个重要的目录:

  1. “staging” 目录,所有已安装的库和应用程序都存放在该目录中。这最初是工具链的 sysroot 目录的副本,并在交叉编译时填充了更多库。
  2. "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


    【解决方案1】:

    根据我的经验,您不需要编译 dbus。你可以这样做

    通过https://wiki.debian.org/EmDebian/CrossDebootstrapdebootstrap 创建 Debian 跨 rootfs
    通过 crosstool-ng 创建你的交叉编译工具链,并确保内核版本和 eglibc 版本与第一步创建的 rootfs 相同
    通过

    构建QT
    CPPFLAGS=-I<rootfs>/usr/include \
    LDFLAGS=-L<rootfs>/lib -L<rootfs>/usr/lib -Wl,-rpath-link,<rootfs>/lib,<rootfs>/usr/lib \
    ./configure <your options>
    make
    

    通过

    将QT安装到stage目录中
    make install DESTDIR=<stage directory>
    

    从rootfs复制QT依赖库到你的stage目录

    所以你可以看到,舞台目录保持最小,没有污染。

    【讨论】:

    • 太棒了,debootstrap 正是我想要的。花了一点时间让它在 OpenSuSE 上工作,但最后,它是完美的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2016-05-27
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多