构建内核; WSL2;错误:初始化元素不是常量

Posted

技术标签:

【中文标题】构建内核; WSL2;错误:初始化元素不是常量【英文标题】:Building Kernel; WSL2; error: initializer element is not constant 【发布时间】:2021-09-21 09:32:58 【问题描述】:

我正在尝试使用本教程在 Ubuntu-18.04 WSL2构建内核: https://www.frakkingsweet.com/running-pi-gen-on-wsl2/

配置一切正常。 但是在构建它时:

制作 KCONFIG_CONFIG=Microsoft/config-wsl.new -j4

出现此错误:

drivers/hyperv/dxgkrnl/dxgmodule.c:422:39:错误:初始化元素不是常量 const int DXGK_VMBUS_VERSION_OFFSET = DXGK_VMBUS_CHANNEL_ID_OFFSET +

发生错误的 dxgmodule 文件是 C 文件文件内容:

419: /* vGPU VM 总线通道实例 ID */

420: 常量 int DXGK_VMBUS_CHANNEL_ID_OFFSET = 192;

421: /* DXGK_VMBUS_INTERFACE_VERSION (u32) */

422: const int DXGK_VMBUS_VERSION_OFFSET = DXGK_VMBUS_CHANNEL_ID_OFFSET +

423: sizeof(guid_t);

如何更改代码,以便编译器将初始化表达式读取为常量?

【问题讨论】:

我认为代码依赖于允许这种初始化形式的最新版本的 GCC。它不适用于较旧的 GCC 版本。应该更改代码以与可用于构建内核的最低 GCC 版本兼容。我猜这个问题会在微软代码被上游化到 Linux 时被发现。 另见此问题:Why “initializer element is not a constant” is… not working anymore?. 安装 gcc 9 解决了这个问题 【参考方案1】:

我有一个解决办法。

我改成

419: /* vGPU VM 总线通道实例 ID */

420: 常量 int DXGK_VMBUS_CHANNEL_ID_OFFSET = 192;

421: /* DXGK_VMBUS_INTERFACE_VERSION (u32) */

422: const int DXGK_VMBUS_VERSION_OFFSET = 192 +

423: sizeof(guid_t);

【讨论】:

以上是关于构建内核; WSL2;错误:初始化元素不是常量的主要内容,如果未能解决你的问题,请参考以下文章

MSVC:为啥“#pragma fenv_access (on)”会导致“错误 C2099:初始化程序不是常量”?

rails 链接表“未初始化的常量”错误

RSpec - 未初始化的常量,例如double

路由错误未初始化常量用户

错误 - 未初始化的常量 Project::Ticket

未定义的方法和未初始化的常量错误