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

Gcc 如何为Raspberry Pi 1创建现代交叉编译工具链?,gcc,raspberry-pi,cross-platform,raspbian,Gcc,Raspberry Pi,Cross Platform,Raspbian,至少Debian没有为Raspberry Pi 1的交叉开发提供可用的工具链。在撰写本文时,Linaro toochain对于Qt5开发者分支来说太旧了。有一个项目crosstools ng,它允许轻松地为各种系统构建自定义工具链。它支持相当现代的GCC4.9.1。配置是一种尝试和错误,但主要问题是,工具链没有找到所有包含的文件或库。如何配置crosstools ng,以便可以使用它为Raspberry Pi 1编译Qt5 下面是关于如何准备使用此工具链的Raspberry Pi和Raspian

至少Debian没有为Raspberry Pi 1的交叉开发提供可用的工具链。在撰写本文时,Linaro toochain对于Qt5开发者分支来说太旧了。有一个项目crosstools ng,它允许轻松地为各种系统构建自定义工具链。它支持相当现代的GCC4.9.1。配置是一种尝试和错误,但主要问题是,工具链没有找到所有包含的文件或库。如何配置crosstools ng,以便可以使用它为Raspberry Pi 1编译Qt5

下面是关于如何准备使用此工具链的Raspberry Pi和Raspian的后续信息:

我首先从未找到的include/library问题开始,因为这超出了crosstools ng的正常安装/使用范围

问题是,crosstools ng正确地创建了gcc编译器,其目标元组如下:arm供应商linux gnueabihf。这是完全正确的。但是,Raspian在没有供应商字符串:/lib/arm-linux-gnueabihf的文件夹中安装include和libs。看起来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
完成的

尽管每个配置项都非常长,但我在这里添加了一个工作配置文件:

它可以导入并使用加载备用配置文件。最后,
ct ng build
在几分钟内构建了一个新的 工具链。工具链是在配置文件中定义的{HOME}/x-tools3中创建的。要更改此选项,请更改“路径和杂项选项”中的“前缀目录”。但是工具链也可以在构建之后手动移动


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

当我尝试使用git版本的crosstool ng构建交叉编译器时,会出现以下错误:“GAS不知道目标arm linux gnueabihf使用哪种格式”。如果我将“未知”部分保留在其中,则会出现同样的错误,它起作用了。