Zephyr RTOS(STM32)自定义节点编译报错:undefined reference to `__device_dts_ord_17`
在另一台PC上可正常运行的Zephyr代码,当前PC执行zephyr build编译时出错。代码片段:
const struct device *dev = DEVICE_DT_GET(DT_NODELABEL(mygpio)); if (!device_is_ready(dev)) { printk("unready"); }
报错信息:undefined reference to __device_dts_ord_17'`
已完成的配置:
- 在
nucleo_f334r8.overlay中添加了自定义mygpio节点 prj.conf中开启了相关外设配置- 在
dts/bindings下定义了对应设备绑定文件 - 编译后
build/zephyr.dts和devicetree_generated.h中已生成序号为17的mygpio节点,但zephyr.map中无__device_dts_ord_17的引用 - 默认外设(如gpioa)可正常使用
- 已查阅官方故障排查文档但未解决
检查驱动代码的设备注册宏
确保对应驱动中使用了DEVICE_DT_INST_DEFINE()或DEVICE_DT_DEFINE()宏来注册设备,且宏中的设备序号(或节点路径)与mygpio节点的dts序号匹配。如果驱动注册宏未正确关联该节点,不会生成__device_dts_ord_17符号。验证绑定文件与overlay节点的compatible匹配
确认nucleo_f334r8.overlay中mygpio节点的compatible属性值,和dts/bindings下绑定文件的compatible字段完全一致(大小写、字符均不能出错)。两者不匹配时,Zephyr无法将节点关联到对应驱动,也就不会生成设备符号。检查overlay节点的status属性
确保mygpio节点的status属性设置为"okay",如果是"disabled"或未设置,Zephyr会跳过该节点的设备实例化,不会生成对应的设备符号。彻底清理build目录后重新编译
执行west build -t clean清理旧编译产物,再重新执行west build。旧缓存文件可能导致dts节点与驱动的关联未更新,清理后重新编译可解决这类缓存问题。确认Kconfig配置是否真正生效
检查build/zephyr/.config文件,确认相关驱动启用配置(比如CONFIG_GPIO或自定义驱动的Kconfig选项)已被正确设置为y或m。若配置未生效,驱动不会被编译进固件,自然不会生成对应的设备符号。对比两台PC的Zephyr版本
查看两台PC上的Zephyr版本(west zephyr-export --version),若版本不一致,可能存在dts处理或设备注册的语法差异。尝试将当前PC的Zephyr版本切换到另一台PC的版本再编译测试。
内容的提问来源于stack exchange,提问作者Jokubas11

