如何解决链接错误: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
相关产品推荐
相关产品推荐

