这是典型的链接顺序/符号解析问题。HAL库中__weak函数(如HAL_GPIO_EXTI_Callback)定义在stm32fxxx_hal_xxx.c里,用户重定义通常放在main.c或自定义.c。若仍进默认实现,先确认:1) 用户函数签名与__weak原型完全一致(含const、参数类型、返回类型),C++工程需extern "C";2) 用户函数所在.c是否加入编译(Keil看是否在Target组、CubeIDE看是否被排除);3) 链接器是否把用户.o放在库/启动文件之前——GCC下链接顺序影响弱符号覆盖,确保用户目标文件在HAL库之前;4) 检查map文件,搜索该符号,看最终解析到哪个.o,若解析到hal_xxx.o说明用户符号未被选中;5) 避免用户函数也被声明为__weak或在头文件重复定义;6) 若使用静态库.a,弱符号在库内可能优先被拉取,需把用户实现放主工程而非库中。实操建议:直接看.map的Symbol表定位,再调整链接脚本或源文件顺序。
mcuku 阿沐 · 2026-10-17