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

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

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

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

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

  • “登台”的目录,所有已安装的库和应用程序都存放在该目录中。这最初是工具链sysroot目录的副本,并且在交叉编译时填充了更多库。
  • “rootfs” 目录,它等效于设备上的目录-本质上是登台目录的副本,没有诸如文档和头文件之类的不需要的东西。据我了解,最好的方法是将所需文件从登台目录复制到rootfs中。

  • 获取rootfs目录很容易,因为可以从设备进行NFS挂载。但是,如何为PI上现有的Emdebian安装获取暂存目录?登台目录需要包括诸如dbus头之类的东西,这些东西未安装在rootfs上。

    某些人只是使用apt-get install libdbus-dev在设备上安装dbus header ,然后将rootfs用作暂存目录。通过此设置,rootfs和暂存之间不再存在任何区别,缺点是rootfs被 header ,文档等污染了。当然,这样做的好处是很容易。

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

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

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

    最佳答案

    以我的经验,您不需要编译dbus。你可以做到

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

    从rootfs复制QT依赖库到您的舞台目录

    因此,您可以看到,舞台目录被保持在最少的数量而没有污染。

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

    10-11 00:27