armcomplier5中怎样将c中没有调用的函数优化掉

在 Makefile 中实现"移除未调用函数"的功能,关键在于分别给 编译规则(生成 .o 文件时)和 链接规则(生成 .axf 文件时)添加对应的参数。

基于 ARM Compiler 5 (armcc/armlink),你需要添加的核心参数是 --split_sections(编译时)和 --remove(链接时)。

以下是具体的修改方法和完整的 Makefile 示例:

🛠️ 核心修改点

你需要修改 Makefile 中的变量定义和规则部分:

  1. 编译阶段 (armcc):

* 在 CFLAGS(编译选项)中加入 --split_sections。

* 作用:让每个函数都单独存放在一个独立的段中。

  1. 链接阶段 (armlink):

* 在 LFLAGS 或 LINKFLAGS(链接选项)中加入 --remove。

* 作用:让链接器自动剔除未被引用的段。

📝 完整的 Makefile 示例

你可以直接参考或复制以下模板,重点关注注释标记的部分:

工具链定义

CC = armcc

ARMLINK = armlink

FROMELF = fromelf

优化与编译选项配置

基础配置

CPU = --cpu=Cortex-M4

建议开启 -O2 或 -O3 优化,配合死代码消除效果更好

OPT = -O2

【关键点1】编译选项

添加 --split_sections,确保每个函数独立成段

CFLAGS = (CPU) (OPT) --split_sections -c

链接选项配置

【关键点2】链接选项

添加 --remove,指示链接器移除未使用的段

LFLAGS = --remove --scatter=scatter.sct

源文件与目标文件

SRC = main.c driver.c utils.c

OBJ = (SRC:.c=.o)

TARGET = app.axf

构建规则

all: (TARGET)

编译规则:生成 .o 文件

%.o: %.c

@echo Compiling <...

(CC) (CFLAGS) < -o @

链接规则:生成 .axf 文件

(TARGET): (OBJ)

@echo Linking...

(ARMLINK) (LFLAGS) (OBJ) -o @

可选:生成 bin 文件

(FROMELF) --bin -o (TARGET:.axf=.bin) @

清理规则

clean:

rm -f (OBJ) (TARGET) $(TARGET:.axf=.bin)

.PHONY: all clean

💡 进阶技巧:配合 LTO 获得极致优化

如果你希望进一步优化,甚至跨文件内联并消除未调用的静态函数,可以开启 链接时优化。

在 Makefile 中同时加入 -flto 标志:

在 CFLAGS 和 LFLAGS 中都加上 -flto

CFLAGS += -flto

LFLAGS += -flto

效果对比:

* 仅 --split_sections + --remove:只能移除外部可见但未调用的函数(例如你在 utils.c 写了函数但在 main.c 没用到)。

* 加上 -flto:编译器能看到整个工程的全貌,连静态 (static) 但未调用的函数也能被识别并移除,且能进行跨文件内联优化。

⚠️ 避坑指南

在使用 --remove 时,如果你的代码中使用了函数指针(例如回调函数、状态机跳转),编译器可能无法静态分析出这些函数被"调用"了,从而导致它们被误删。

解决方法:

  1. 使用 attribute((used)):在函数定义前加上这个属性,强制保留。

void my_callback(void) attribute((used));

void my_callback(void) { ... }

  1. 或者在链接器选项中强制保留:

在 LFLAGS 中添加 --keep='*.o(my_callback)'。

相关推荐
秦明月131 小时前
KUKA机器人Profinet通讯实战指南
经验分享·学习·职场和发展·学习方法·设计规范
半导体守望者2 小时前
MKS MWD-25LD-06/07 匹配器Automatic Matching Network OPERATION MANUAL
经验分享·笔记·机器人·自动化·制造
青稞社区.2 小时前
OpenAI 翁家翌:“启发式学习”的强化学习新范式
人工智能·经验分享·学习·agi
captain_AIouo3 小时前
全方位降本增效,Captain AI重构OZON运营成本结构
大数据·人工智能·经验分享·重构·aigc
LaughingZhu13 小时前
Product Hunt 每日热榜 | 2026-05-08
人工智能·经验分享·深度学习·神经网络·产品运营
智者知已应修善业18 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
智者知已应修善业18 小时前
【51单片机如何让LED灯从一亮到八,再从八亮到一】2023-10-13
c++·经验分享·笔记·算法·51单片机
weixin_5372170621 小时前
Ai产品经理资源合集(第五辑)
经验分享
谙弆悕博士1 天前
快速学C语言—— 第0章:C语言简介
c语言·开发语言·经验分享·笔记·程序人生·课程设计·学习方法