如何为 Raspberry Pi 1 创建现代交叉编译工具链?

How can I create a modern cross compile toolchain for the Raspberry Pi 1?

至少 Debian 没有提供可用的工具链来为 Raspberry Pi 1 进行交叉开发。Linaro 工具链在撰写本文时对于 Qt5 开发人员分支来说太旧了。有一个项目 crosstools-ng,可以轻松地为各种系统构建自定义工具链。它支持相当现代的 GCC 4.9.1。配置有点反复试验,但主要问题是工具链没有找到所有包含文件或库。如何配置 crosstools-ng 以便它可以用于为 Raspberry Pi 1 编译 Qt5?

有关如何使用 Raspian 准备使用此工具链的 Raspberry Pi 的后续信息,请参见此处:

我先从未找到的 include/library 问题开始,因为这超出了正常的 crosstools-ng installation/usage.

问题是,crosstools-ng 正确地创建了 gcc 编译器,目标元组如下:arm-vendor-linux-gnueabihf。这是完全正确的。但是,Raspian 在没有供应商字符串的文件夹中安装包含和库:/lib/arm-linux-gnueabihf。看起来 pkg-config 无法处理这个。 crosstools-ng 可能与元组是正确的,但由于拒绝添加删除此供应商字符串的功能,因此也有点笨拙。 crosstool-ng 中允许修改元组和供应商字符串的函数不是替代方案。他们只是用新名称创建符号链接,但元组在 GCC 中是硬编码的。正确删除供应商字符串的唯一方法是修补 crosstools-ng 源。

因此,获得功能性 Raspberry Pi/Raspian gcc 4.9.1 工具链的第一步是克隆 crosstools-ng 存储库:

git clone git://crosstool-ng.org/crosstool-ng

其次是修补源代码:

diff --git a/scripts/config.guess b/scripts/config.guess
index dbfb978..9a35943 100755
--- a/scripts/config.guess
+++ b/scripts/config.guess
@@ -176,7 +176,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
            sh3el) machine=shl-unknown ;;
            sh3eb) machine=sh-unknown ;;
            sh5el) machine=sh5le-unknown ;;
-           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH} ;;
        esac
        # The Operating System including object format, if it has switched
        # to ELF recently, or will in the future.
diff --git a/scripts/config.sub b/scripts/config.sub
index 6d2e94c..f92db2b 100755
--- a/scripts/config.sub
+++ b/scripts/config.sub
@@ -317,7 +317,7 @@ case $basic_machine in
        | we32k \
        | x86 | xc16x | xstormy16 | xtensa \
        | z8k | z80)
-               basic_machine=$basic_machine-unknown
+               basic_machine=$basic_machine
                ;;
        c54x)
                basic_machine=tic54x-unknown

其余的是标准 configure/make/make 安装。 下一步是正确配置 crosstools-ng 以构建所需的工具链。这是通过 ct-ng menuconfig.

完成的

虽然每一个配置项都会非常冗长,所以我在这里添加了一个工作配置文件: http://pastebin.com/MhQKnhpN

可以导入并使用加载备用配置文件。最后 ct-ng build 在几分钟内构建了一个新的 工具链。工具链在 {HOME}/x-tools3 中创建,如配置文件中所定义。要更改此设置,请更改 'Path and misc options' 中的 'Prefix directory'。但是工具链也可以在构建后手动移动。

下一个 question/answer 将展示如何使用此工具链为 Raspberry Pi 构建非常现代的 Qt5。