将现有的根文件与自定义工具链结合起来



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

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

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

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

对于交叉编译,有两个重要的目录,据我所知:
  1. "staging"目录,存放所有已安装的库和应用程序。它最初是工具链的sysroot目录的副本,并在交叉编译时填充更多库。
  2. "rootfs"目录,它相当于设备上的目录-本质上是staging目录的副本,没有文档和头文件等不必要的东西。据我所知,最好的方法是从暂存目录中将所需的文件复制到rootfs.

获取rootfs目录很容易,因为它可以从设备上通过NFS挂载。但是,如何为PI上现有的Emdebian安装获得一个暂存目录呢?staging目录需要包含诸如dbus头文件之类的内容,这些内容没有安装在rootfs上。

有些人只是在设备上安装dbus头文件,使用apt-get install libdbus-dev,然后使用rootfs作为staging目录。通过这种设置,rootfs和staging之间不再有区别,缺点是rootfs被头文件、文档等污染了。优点当然是很容易。

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

作为一个附带问题,为什么获得一个工具链,编译一个程序,然后在目标上复制它的方法是有效的?工具链自带libc、libstdc++等版本,它们与目标上安装的版本不兼容吗?特别是在使用crostool -ng编译的自定义工具链创建时?

(请注意,我不是在问如何编译Qt,我可以自己弄清楚。我的问题更一般,关于将自定义工具链与现有安装(/rootfs)

结合使用时所采取的方法。

根据我的经验,您不需要编译您的dbus。你可以通过

创建Debian交叉rootfs通过debootstrap通过https://wiki.debian.org/EmDebian/CrossDebootstrap
通过crostool -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目录

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

相关内容

  • 没有找到相关文章

最新更新