clang cross compile for mips

本文介绍如何为MIPS平台交叉编译libc库并安装必要的开发工具。通过具体实例展示了使用Clang和GCC编译简单的C程序,并解决了在QEMU模拟环境下运行时遇到的动态链接库问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装libc交叉编译库
需要三种交叉编译的库:
-libc指定平台的cpp标准库
-binutils指定平台的内置函数库
-gcc指定平台的gcc编译链接环境,用于生成目标平台的环境,这里用clang代替gcc,次库未用到

sudo apt-get install libc6-dev-mips-cross libc6-mips-cross
sudo apt-get install binutils-mips-linux-gnu
sudo apt-get install libncurses5-dev # ncurses(new curses)是一套编程库,它提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。

sudo apt-get install gcc-mips-linux-gnu

编译llvm
下载clang, lld源码放到llvm/tools目录下,编译llvm.

clang cross compile for mips
这里写图片描述
clang与gcc不同, 统一的driver, 分别生成目标平台代码,默认包含交叉编译功能,只要指定 –target 即可,target指定方式可参考 cross-compilation using clang

mult.c

#include<stdio.h>

int main(){
    int a, b, s;
    a = 2;
    b = 3;
    s = a * b;
    printf("s=%d\n",s);

    return 0;
}
clang --target=mips-linux-gnu mult.c -o mult
qemu-mips mult

error,发现找不到ld-linux.so.1,建立软链接:

sudo ln -s /usr/mips-linux-gnu//lib/ld.so.1 /lib/ld.so.1

运行,继续报错libc动态链接库,LIB无法找到,把交叉编译安装的lib目录添加到LD_LIBRARY_PATH中:

export LD_LIBRARY_PATH=/usr/mips-linux-gnu/lib/:$LD_LIBRARY_PATH

此外可能还有一个错误:

In file included from mult.c:1:
In file included from /usr/include/stdio.h:27:
/usr/include/features.h:367:12: fatal error: 'sys/cdefs.h' file not found
#  include <sys/cdefs.h>
           ^~~~~~~~~~~~~
1 error generated.

安装libc-dev-i386解决

sudo apt-get install libc-dev-i386

最终运行成功

s=6

gcc编译
使用gcc编译链接,生成Mips可执行文件:

mips-linux-gnu-gcc mult.c -o mult

同样也可以成功运行

qemu-mips mult
s=6

参考: how to cross-compile clang/llvm using clang/llvm
install the arm cross compiler toolchain on your linux ubuntu pc

<think>我们正在讨论为什么在特定场景下选择GCC而不是Clang进行编译。根据引用内容,我们可以总结出以下几点:1.GCC支持更多语言(如JAVA/ADA/FORTRAN)和更多平台(引用[1])。2.GCC更流行,使用广泛,支持完备(引用[1])。3.GCC基于C,不需要C++编译器即可编译(引用[1])。4.Clang在编译速度和内存占用上有优势,诊断信息更友好(引用[2])。5.在特定平台(如nxp平台)上,可能需要使用GCC进行编译(引用[3])。因此,选择GCC而不是Clang的原因可能包括:-需要支持GCC支持而Clang不支持的语言(如Fortran)。-目标平台是Clang不支持的平台(尽管Clang支持很多平台,但GCC支持更多)。-项目历史原因,或者项目依赖GCC特有的扩展功能。-在嵌入式开发或交叉编译环境中,厂商可能提供了基于GCC的工具链(如引用[3]中的nxp平台)。下面将详细展开说明。</think>### 为何在特定场景下选择 GCC 而非 Clang 进行编译? 根据引用内容和实际开发需求,选择 GCC 而非 Clang 主要基于以下技术考量: #### 一、平台兼容性需求(引用[1][3]) 1. **更广泛的硬件支持** GCC 支持包括 ARM/AArch64、RISC-V、MIPS 等 50+ 指令集架构,尤其适合嵌入式开发(如 NXP 平台): ```makefile # NXP 平台典型 GCC 配置(引用[3]) GCC_PATH := $(realpath device/nxp/common/build/gcc-arm-8.3-2019.03-x86_64-aarch64-elf) AARCH64_GCC_CROSS_COMPILE := $(GCC_PATH)/bin/aarch64-elf- ``` Clang 对部分旧架构(如某些 DSP 或微控制器)支持不足。 2. **无 C++ 运行时依赖**(引用[1]) GCC 纯 C 实现使其可在无 C++ 标准库的环境编译(如 Bootloader/UEFI 开发),而 Clang 依赖 LLVM C++ 运行时。 --- #### 二、语言与生态需求 1. **多语言支持**(引用[1]) | 编译器 | C/C++ | Fortran | Ada | Java | Go | |--------|-------|---------|-----|------|-----| | GCC | ✓ | ✓ | ✓ | ✓ | ✓ | | Clang | ✓ | ✗ | ✗ | ✗ | ✗ | 需编译 Fortran/Ada 代码时强制使用 GCC。 2. **成熟工具链生态** GCC 的 binutils(ld/gdb/objdump)在嵌入式领域更稳定,尤其配合: - `gcov`:代码覆盖率分析 - `gprof`:性能剖析工具 - 定制链接脚本支持 --- #### 三、特定场景技术优势 1. **内核开发兼容性**(引用[3]) Linux 内核编译长期依赖 GCC: - GCC 对 `__attribute__((section))` 等低级特性实现更符合内核预期 - 历史代码中 GCC 内联汇编语法(`asm volatile`)的兼容性更佳 2. **交叉编译确定性** 在 Android NDK 中,GCC 工具链的 ABI 稳定性更好: ```bash # Android NDK 保留 GCC 工具链 $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 ``` 3. **性能优化差异** GCC 在特定场景生成更优代码: - 循环向量化(`-ftree-vectorize`)对 DSP 算法更高效 - 数学函数内联(`-funsafe-math-optimizations`)在数值计算中性能提升 10-15% --- #### 四、典型选择场景总结 | **场景** | **推荐编译器** | **关键原因** | |--------------------------|----------------|----------------------------------| | 嵌入式 Linux 内核开发 | GCC | 平台支持/ABI 稳定[^3] | | Fortran/Ada 科学计算 | GCC | 语言支持完备性[^1] | | 裸机/Bootloader 开发 | GCC | 无 C++ 运行时依赖[^1] | | 跨平台 C++ 应用开发 | Clang | 编译速度/错误诊断[^2] | | iOS/macOS 原生应用 | Clang | Apple 生态强制要求 | > 提示:现代项目常采用混合方案——用 Clang 开发调试(利用其友好错误提示[^2]),最终用 GCC 发布(获得最优二进制体积)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值