2013-03-16 72 views
5

我已经安装了一个Emdebian的Raspberry PI,并且想要交叉编译项目。将现有的rootfs与自定义工具链结合使用

关于如何获得工具链和使用它构建一个简单的项目有大量的文档。我自己设法用crosstool-ng构建了一个工具链,并编写了一个可以正常工作的Hello World程序。

我没有得到的是如何处理交叉编译更复杂的项目,如Qt,它依赖于其他库。我们以libdbus为例,因为这是Qt的依赖关系之一。

安装的Emdebian已经包含了libdbus.so,所以自然我宁愿使用它,而不是交叉编译我自己的libdbus.so,因为编译Qt的所有依赖都需要很长时间。

进行交叉编译,有两个重要的目录,据我的理解:

  1. “分期”目录,其中已安装的所有库和应用程序生活。这最初是工具链的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的,我能明白这一点我自己。我的问题是更普遍的,讲的是一个现有的安装/根文件系统相结合的自定义工具链时采取的做法)

回答

1

根据我的经验,你不需要编译你的dbus。你可以做到这一点作为

创建Debian的交叉根文件系统通过debootstrap的由https://wiki.debian.org/EmDebian/CrossDebootstrap
创建通过的crosstool-NG你的CRO编译工具链,并确保内核版本和eglibc版本是一样的第一步
创建根文件系统建立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进入阶段目录由

make install DESTDIR=<stage directory> 

复制QT依赖库e您的舞台目录

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

+0

真棒,debootstrap正是我正在寻找。花了一些时间去研究OpenSuSE,但最终它是完美的:) – 2014-09-30 21:00:02

相关问题