You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 to qemu_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:35:17