本文约1000字,前几天完成新方案系统移植的第三方库交叉编译处理,需要做好不同架构平台的适配编译。本文梳理第三方库根据arm/mips/x86不同平台的精准配置。
我建了一个BSP学习交流群,想学BSP或者已经是BSP开发者可私信我,加入群,一起交流学习,共同进步。
关注公众号, 即可获得与Linux相关的电子书籍(含《ARM 嵌入式系统基础教程》)以及常用开发工具,文末有文档清单。
在嵌入式 Linux 开发中,第三方库交叉编译是高频刚需。
./configure 作为 autotools 构建体系的入口,其参数直接决定能否编译出匹配目标架构、CPU、系统环境的稳定库文件。
本文围绕项目上第三方库的一条通用交叉编译命令来解析:
./configure CC=$(CROSSCOMPILE)gcc \--host=$(HOST) \--prefix=$(INSTALL_DIR) \CFLAGS=$(FLAGS) \CXXFLAGS=$(FLAGS) \LDFLAGS=$(FLAGS) \--disable-shared
系统性讲解:各参数含义、如何按 ARM/MIPS/x86 等架构选择、如何匹配 CPU / 系统 / 工具链。
一 交叉编译的 4 个核心要素
目标架构:arm / arm64 / mips / mipsel / i386 / x86_64
系统环境:linux / buildroot / uclibc / glibc / musl
CPU 型号:cortex-a7 / cortex-a53 / xburst2 / pangu
交叉工具链:arm-linux-gnueabihf- / aarch64-linux-gnu- / mips-linux-gnu-
configure 的所有参数,都是为了描述这 4 件事。
二 命令中每个参数的作用与配置规则
[1]. CC 指定交叉编译器
CC=$(CROSSCOMPILE)gccCROSSCOMPILE 是工具链前缀,例如:ARM 32bit:arm-linux-gnueabihf-ARM64:aarch64-linux-gnu-MIPS 小端:mipsel-linux-gnu-MIPS 大端:mips-linux-gnu-
最终 CC 应为:arm-linux-gnueabihf-gcc
原则:前缀必须与项目上的工具链完全一致。
[2]. --host 指定目标平台(决定编译出什么架构)
--host=$(HOST)这是架构识别核心参数,configure 靠它判断目标系统。
最常用 host 规范写法

说明:错误写法会导致编译 x86 代码跑到ARM上、无法识别浮点数、汇编错误。
[3]. --prefix 安装路径(无坑,只需填写绝对路径)
--prefix=$(SRC_PATH)/xxx/install用于指定 make install 输出路径,与架构无关。
[4]. CFLAGS / CXXFLAGS 编译优化与 CPU 指定(最影响性能)
CFLAGS="..."CXXFLAGS="..."用于指定:架构指令集CPU 型号优化等级浮点数模式宏定义
>>ARM 最常用 CFLAGS
# ARM Cortex-A7 通用-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
# ARM Cortex-A53/A55 (arm64)
-march=armv8-a -mtune=cortex-a53# 软浮点(uclibc 常见)
-mfloat-abi=soft# 标准优化(必加)
-O2 -fPIC -Wall>>MIPS 常用 CFLAGS
-march=mips32r2 -mtune=mips32-O2 -fPIC
>>x86
-march=i686 -O2 -fPIC核心规则:
-march:指定架构版本-mtune:指定具体 CPU,优化执行效率-mfpu:指定浮点运算单元-mfloat-abi:hard /softfp/soft(嵌入式必正确)
[5]. LDFLAGS 链接参数
LDFLAGS="-static"常用:
-static:静态链接-Lxxx:指定库路径-Wl,--gc-sections:减小体积
[6]. --disable-shared(强制静态库,嵌入式首选)
--disable-shared嵌入式系统几乎都用静态库(.a),不加会默认编译动态库,可能导致:
依赖问题、部署失败、版本不兼容
三 按平台直接套用的模板
[1].ARM 32bit(armv7 / cortex-a7 / uclibc)
HOST=arm-linux-uclibcgnueabihfCROSSCOMPILE=arm-linux-uclibcgnueabihf-CFLAGS="-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -O2 -fPIC"
[2].ARM 32bit(glibc)
HOST=arm-linux-gnueabihfCROSSCOMPILE=arm-linux-gnueabihf-
[3]. ARM64 (aarch64)
HOST=aarch64-linux-gnuCROSSCOMPILE=aarch64-linux-gnu-CFLAGS="-march=armv8-a -O2 -fPIC"
[4].MIPS 小端(mipsel)
HOST=mipsel-linux-gnuCROSSCOMPILE=mipsel-linux-gnu-CFLAGS="-march=mips32r2 -O2 -fPIC"
[5].x86_64
HOST=x86_64-linux-gnuCROSSCOMPILE=""CFLAGS="-O2 -fPIC"
四 判断架构的自动识别脚本(Makefile 万能片段)
可以在 Makefile 中自动判断架构,自动赋值 HOST、CROSSCOMPILE、CFLAGS:
ifeq ($(ARCH),arm)HOST=arm-linux-gnueabihfCROSSCOMPILE=arm-linux-gnueabihf-CFLAGS=-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -O2 -fPICendififeq ($(ARCH),arm64)HOST=aarch64-linux-gnuCROSSCOMPILE=aarch64-linux-gnu-CFLAGS=-march=armv8-a -O2 -fPICendififeq ($(ARCH),mipsel)HOST=mipsel-linux-gnuCROSSCOMPILE=mipsel-linux-gnu-CFLAGS=-march=mips32r2 -O2 -fPICendif
使用:
make ARCH=arm
五 最常见的5个坑
--host 写错 → 编译成 x86
CROSSCOMPILE 前缀不匹配 → 找不到编译器
-mfloat-abi 错误 → 浮点异常
没加 -fPIC → 静态库无法链接
没加 --disable-shared → 生成动态库无法使用
六 总结
CC = 工具链前缀 + gcc
--host = 目标架构三元组
CFLAGS = 指令集 + CPU + 优化
--disable-shared 必加
架构不同,参数完全不同
只要按这套规则配置,openssl、ffmpeg、curl、zlib、libpng 等 autotools 库绝大部分都能一次交叉编译成功。
以上为全文内容。

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助