gpt4 book ai didi

linux - 将现有的 rootfs 与自定义工具链相结合

转载 作者:IT王子 更新时间:2023-10-29 00:41:58 27 4
gpt4 key购买 nike

我有一个安装了 Emdebian 的树莓派,想交叉编译项目。

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

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

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

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

  1. “staging” 目录,所有已安装的库和应用程序都存放在这里。这最初是工具链 sysroot 目录的副本,并在交叉编译时填充了更多库。
  2. “rootfs” 目录,相当于设备上的目录 - 本质上是暂存目录的副本,没有文档和头文件等不需要的内容。据我所知,最好的方法是将所需文件从暂存目录复制到 rootfs。

获取 rootfs 目录很容易,因为它可以是从设备挂载的 NFS。但是我如何获得 PI 上现有 Emdebian 安装的暂存目录?暂存目录需要包含诸如 dbus header 之类的内容,这些内容未安装在 rootfs 上。

有些人只是简单地在设备上安装 dbus 头文件,使用 apt-get install libdbus-dev,然后使用 rootfs 作为暂存目录。有了这个设置,rootfs 和 staging 之间就没有区别了,缺点是 rootfs 被头文件、文档等污染了。好处当然是简单。

将 dbus header 放入主机上的暂存目录的最佳方法是什么?人们在这种情况下通常使用的方法是什么?

作为附带问题,为什么获取工具链、编译程序然后将其复制到目标上的方法完全有效?工具链提供自己的 libc、libstdc++ 等版本,它们是否与目标上安装的版本不兼容?尤其是在使用由 crosstool-ng 编译的自定义工具链创建时?

(请注意,我不是在问如何编译 Qt,我可以自己弄清楚。我的问题更笼统,关于将自定义工具链与现有安装/rootfs 组合时采用的方法)

最佳答案

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

通过 https://wiki.debian.org/EmDebian/CrossDebootstrap 的 debootstrap 创建 Debian cross rootfs
通过 crosstool-ng 创建你的 cros-compile 工具链,并确保内核版本和 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>

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

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

关于linux - 将现有的 rootfs 与自定义工具链相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com