【问题标题】:How can I create a modern cross compile toolchain for the Raspberry Pi 1?如何为 Raspberry Pi 1 创建现代交叉编译工具链?
【发布时间】:2015-05-06 09:05:11
【问题描述】:

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

可以在此处找到后续如何准备带有 Raspian 的 Raspberry Pi 以使用此工具链: How do I prepare a Raspberry Pi with Raspbian so I can cross compile Qt5 programs from a Linux host?

【问题讨论】:

    标签: gcc raspberry-pi cross-platform raspbian


    【解决方案1】:

    我首先从未找到的包含/库问题开始,因为这超出了正常的 crosstools-ng 安装/使用。

    问题是,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
    

    剩下的是标准的配置/制作/制作安装。 下一步是正确配置 crosstools-ng 以构建所需的工具链。这是通过ct-ng menuconfig 完成的。

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

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

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

    【讨论】:

    • 当我尝试使用 git 版本的 crosstool-ng 构建交叉编译器时出现以下错误:“GAS 不知道目标 arm-linux-gnueabihf 使用什么格式”。
    • 我遇到了同样的错误,如果我把“未知”部分留在里面,它可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2012-06-28
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多