少于 1 分钟阅读 次阅读

在使用Rockchip RK3568平台开发时,可能会遇到内核编译失败的情况。例如,使用./build.sh -K编译Linux内核时,可能会出现各种编译错误,而添加-C选项(即使用Clang编译器)后问题却能够解决。以下是对该问题的分析和解决过程的详细记录。

问题描述

在执行以下命令时:

./build.sh -K

编译失败,日志中提示某些模块或驱动的代码无法通过编译。

错误日志:

AR drivers/gpu/drm/built-in.a
AR drivers/gpu/built-in.a
make: *** [Makefile:1194: drivers] Error 2
CC kernel/kheaders.o
AR kernel/built-in.a

failed to build some targets (02:26 (mm:ss))

然而,当改用以下命令时:

./build.sh -CK

编译成功,且内核能够正常生成。


原因分析

  1. 编译器差异
    默认情况下,./build.sh -K使用GCC作为编译器,而-C选项明确指定使用Clang编译器。Clang和GCC在代码解析、语法检查和优化策略上存在差异,某些代码可能对Clang的支持更好,而在GCC下会触发错误。

  2. 代码适配性
    Rockchip平台的部分驱动代码可能更倾向于Clang编译器。例如,某些内联汇编代码或宏定义可能仅在Clang下工作正常,而在GCC下会报错。
  3. Google GMS认证需求
    如果目标是开发Android系统,Google要求内核必须使用Clang编译器进行编译。Rockchip提供的代码可能默认对Clang进行了优化,而对GCC的支持较弱。

  4. 工具链配置问题
    如果GCC工具链版本不匹配或未正确配置,也可能导致编译失败。而Clang工具链可能已经在开发环境中正确配置,因此能够成功编译。

解决方案

通过添加-C选项,强制使用Clang编译器来编译内核,可以有效解决上述问题。以下是具体的解决步骤:

  1. 使用-C选项进行编译 在执行build.sh脚本时,添加-C选项。例如:
    ./build.sh -CK
    

    其中:

    • -C:指定使用Clang编译器。
    • -K:编译Linux内核。

留下评论