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

如何解决链接错误:undefined reference to `VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT`

MinGW-w64编译虚拟磁盘ISO操作代码的链接错误解决

问题场景

示例代码example.c:

#include <windows.h>
#include <virtdisk.h>

int main() {
    VIRTUAL_STORAGE_TYPE storageType = {VIRTUAL_STORAGE_TYPE_DEVICE_ISO, VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT};
    HANDLE virtualDiskHandle;
    OPEN_VIRTUAL_DISK_PARAMETERS openParameters;
    ULONG result;
    LPCWSTR isoPath = L"path_to_iso_file.iso";
    result = OpenVirtualDisk(&storageType, isoPath, VIRTUAL_STORAGE_TYPE_DEVICE_ISO, OPEN_VIRTUAL_DISK_FLAG_NONE, &openParameters, &virtualDiskHandle);
    if (result != ERROR_SUCCESS) {
        return 1;
    }
    CloseHandle(virtualDiskHandle);
    return 0;
}

使用MinGW-w64(gcc 13.1.0,MSYS2构建)执行编译命令:

gcc -Wall -Wextra example.c -lvirtdisk

出现链接错误:

C:/tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\tools\msys64\tmp\cciUwbcG.o:example.c:(.rdata$.refptr.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT[.refptr.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT]+0x0): undefined reference to `VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT'
collect2.exe: error: ld returned 1 exit status

手动添加DEFINE_GUID定义后仍出现相同错误,clang编译也存在该问题。

解决方法

方法一:直接初始化GUID结构体

绕过预定义的VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT符号,直接在代码中初始化GUID值:

#include <windows.h>
#include <virtdisk.h>

int main() {
    VIRTUAL_STORAGE_TYPE storageType = {
        VIRTUAL_STORAGE_TYPE_DEVICE_ISO,
        {0xec984aec, 0xa0f9, 0x47e9, {0x90, 0x1f, 0x71, 0x41, 0x5a, 0x66, 0x34, 0x5b}}
    };
    HANDLE virtualDiskHandle;
    OPEN_VIRTUAL_DISK_PARAMETERS openParameters;
    ULONG result;
    LPCWSTR isoPath = L"path_to_iso_file.iso";
    result = OpenVirtualDisk(&storageType, isoPath, VIRTUAL_STORAGE_TYPE_DEVICE_ISO, OPEN_VIRTUAL_DISK_FLAG_NONE, &openParameters, &virtualDiskHandle);
    if (result != ERROR_SUCCESS) {
        return 1;
    }
    CloseHandle(virtualDiskHandle);
    return 0;
}

方法二:通过INITGUID宏正确定义GUID

在包含头文件前定义INITGUID宏,确保DEFINE_GUID生成实际的符号定义而非仅声明:

#define INITGUID
#include <windows.h>
#include <virtdisk.h>

DEFINE_GUID(VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT, 0xec984aec, 0xa0f9, 0x47e9, 0x90, 0x1f, 0x71, 0x41, 0x5a, 0x66, 0x34, 0x5b);

int main() {
    VIRTUAL_STORAGE_TYPE storageType = {VIRTUAL_STORAGE_TYPE_DEVICE_ISO, VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT};
    HANDLE virtualDiskHandle;
    OPEN_VIRTUAL_DISK_PARAMETERS openParameters;
    ULONG result;
    LPCWSTR isoPath = L"path_to_iso_file.iso";
    result = OpenVirtualDisk(&storageType, isoPath, VIRTUAL_STORAGE_TYPE_DEVICE_ISO, OPEN_VIRTUAL_DISK_FLAG_NONE, &openParameters, &virtualDiskHandle);
    if (result != ERROR_SUCCESS) {
        return 1;
    }
    CloseHandle(virtualDiskHandle);
    return 0;
}

原因说明

MinGW的virtdisk.h中,VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT默认是通过DECLARE_GUID声明为外部符号,未包含实际定义。若未定义INITGUID宏,DEFINE_GUID会被展开为DECLARE_GUID,仅添加外部声明而非定义,导致链接器无法找到符号实体。

内容的提问来源于stack exchange,提问作者Simon Kissane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:10:02