在STM32 HAL库中,__weak函数(如HAL_GPIO_EXTI_Callback)被用户重写后仍进入默认实现,通常不是链接顺序问题,而是重写函数未被编译进工程或符号未参与链接。排查步骤:1) 确认重写函数所在.c文件已加入工程且参与编译(检查编译输出是否有该.o);2) 检查函数签名与HAL库声明完全一致(含参数类型、const、返回类型),C++工程需加extern "C";3) 用arm-none-eabi-nm查看.map或.o文件,确认重写符号为T(强符号)而非W(弱符号);4) 若重写函数放在静态库.a中,链接器可能不提取该成员,需用--whole-archive或把文件直接加入工程;5) 检查是否同时存在多个同名定义导致冲突,或链接脚本/启动文件覆盖。重点:弱符号解析发生在链接阶段,强符号必须实际出现在链接输入中才能覆盖弱符号。
mcuku 阿沐 · 2026-10-19