如何解决链接错误“未定义引用`VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT`”?

问题描述 投票:0回答:3

考虑以下程序

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_DISK_ACCESS_READ, OPEN_VIRTUAL_DISK_FLAG_NONE, &openParameters, &virtualDiskHandle);
    if (result != ERROR_SUCCESS) {
        return 1;
    }
    CloseHandle(virtualDiskHandle);
    return 0;
}

我尝试使用 MinGW-w64 编译它,但出现此错误:

# 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[.refpt
r.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT]+0x0): undefined reference to `VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT'
collect2.exe: error: ld returned 1 exit status

我需要链接什么才能获得

VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
-lvirtdisk
对于
OpenVirtualDisk
来说已经足够了,但不起作用。

我尝试在

example.c
中手动定义GUID:

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

但是我这样做仍然遇到同样的错误。

我意识到我的

OpenVirtualDisk
调用很可能是错误的,并且如果没有进一步的更改,可能无法工作。但我在这里问的只是让它链接起来。

gcc --version
说:

gcc.exe (Rev6, Built by MSYS2 project) 13.1.0
Copyright (C) 2023 Free Software Foundation, Inc.

我尝试了

clang
,但得到了同样的错误。

c winapi mingw-w64 virtual-disk
3个回答
1
投票

您将需要

-lvirtdisk
-luuid
链接器标志。

  • -lvirtdisk
    对于
    OpenVirtualDisk
  • -luuid
    对于
    VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT

1
投票

我建议您可以按照以下步骤来解决问题:

1,您应该链接

virtdisk.lib
:#pragma comment(lib, "virtdisk.lib")

2, 根据文档:https://learn.microsoft.com/en-us/windows/win32/api/virtdisk/ns-virtdisk-virtual_storage_type

供应商ID

供应商唯一标识符。

VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT (EC984AEC-A0F9-47e9-901F-71415A66345B)

您应该提供

VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT
的标识符:

static const GUID VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT = { 0xEC984AEC, 0xA0F9, 0x47e9, 0x90, 0x1F, 0x71, 0x41, 0x5A, 0x66, 0x34, 0x5B };

0
投票

您可以尝试使用下面的方法来使用

virtdisk.h
,我已经尝试过并且工作得很好。

#include <initguid.h>
#include <virtdisk.h>
#pragma comment(lib,"virtdisk.lib")

整个项目是这样的

#include "pch.h"

#include <Windows.h>

#include <initguid.h>
#include <virtdisk.h>
#pragma comment(lib,"virtdisk.lib")

using namespace winrt;
using namespace Windows::Foundation;

DWORD SimpleCreateVirtualDisk(
    _In_ PCWSTR Path,
    _In_ UINT64 Size,
    _Out_ PHANDLE Handle)
{
    VIRTUAL_STORAGE_TYPE StorageType;
    StorageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
    StorageType.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN;

    CREATE_VIRTUAL_DISK_PARAMETERS Parameters;
    std::memset(&Parameters, 0, sizeof(CREATE_VIRTUAL_DISK_PARAMETERS));
    Parameters.Version = CREATE_VIRTUAL_DISK_VERSION_2;
    Parameters.Version2.MaximumSize = Size;

    return ::CreateVirtualDisk(
        &StorageType,
        Path,
        VIRTUAL_DISK_ACCESS_NONE,
        nullptr,
        CREATE_VIRTUAL_DISK_FLAG_NONE,
        0,
        &Parameters,
        nullptr,
        Handle);
}


int main()
{
    init_apartment();
    
    
}


© www.soinside.com 2019 - 2024. All rights reserved.