我有一个安装了Emdebian的树莓派,我想交叉编译一些项目。
关于如何获取工具链并使用它构建一个简单的项目,有大量的文档。我自己设法用crosstool-ng建立了一个工具链,并编写了一个工作良好的hello world程序。
我不明白的是如何处理交叉编译更复杂的项目,如Qt,它依赖于其他库。让我们以libdbus为例,因为它是Qt的依赖项之一。
安装的Emdebian已经包含libdbus。所以,我自然更喜欢使用它,而不是交叉编译我自己的libdbus。所以,编译Qt的所有依赖项会花费很多时间。
对于交叉编译,有两个重要的目录,据我所知:- "staging"目录,存放所有已安装的库和应用程序。它最初是工具链的sysroot目录的副本,并在交叉编译时填充更多库。
- "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相同
通过
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目录
所以你可以看到,舞台目录保持在最小,没有污染。