如何在QEMU的hw/core/irq.c中使用softmmu/globals.c定义的qemu_name变量?
QEMU编译链接错误:undefined reference to `qemu_name' 解决方法
问题背景
在QEMU 7.1.0版本中,尝试在hw/core/irq.c的qemu_set_irq函数里使用softmmu/globals.c中定义的qemu_name变量:
- 已在
hw/core/irq.c中添加#include "sysemu/sysemu.h"(该头文件通过extern const char *qemu_name;声明了变量) - 编译时出现链接错误:
undefined reference toqemu_name'` - 猜测是编译顺序问题,想调整编译顺序让
globals.c先于irq.c编译
问题根源
不是编译顺序的问题,而是QEMU的构建系统(Meson)中,softmmu/globals.c属于softmmu专属模块,而hw/core/irq.c是被多个目标(比如softmmu、user-mode)共享的代码。当编译user-mode目标时,globals.c不会被编译进去,导致链接找不到符号;即使编译softmmu目标,也可能因为模块依赖配置缺失,导致irq.c所在模块没有链接到globals.c所在的模块。
解决步骤
隔离softmmu专属代码:如果只需要在softmmu模式下使用
qemu_name,用条件编译包裹相关代码,避免在user-mode编译时引入未定义符号:#ifdef CONFIG_SOFTMMU // 这里写使用qemu_name的代码 #endif修正Meson模块依赖:
找到hw/core/meson.build文件,修改irq.c所属静态库的配置,添加对softmmu模块的依赖。比如原配置可能是:hw_core = static_library('hw_core', files('irq.c', ...), dependencies: [qemu_common], )修改为:
hw_core = static_library('hw_core', files('irq.c', ...), dependencies: [qemu_common], link_whole: softmmu_only ? [softmmu_main] : [], )注:QEMU 7.1.0中
softmmu/globals.c属于softmmu_main模块,可查看softmmu/meson.build确认具体模块名。重新构建项目:
清理旧构建文件后重新配置编译:make clean ./configure --enable-softmmu # 按需添加其他编译参数 make
关键说明
- QEMU的Meson构建系统会根据目标(softmmu/user)自动筛选编译模块,共享代码不能直接依赖仅softmmu存在的符号,必须通过条件编译隔离或明确添加模块依赖。
- Meson会自动处理依赖的编译顺序,只要依赖配置正确,就不会出现符号找不到的问题,编译顺序不是核心原因。
内容的提问来源于stack exchange,提问作者rusty_green
相关产品推荐
相关产品推荐

