4

我正在尝试编写一个可以管理 Windows 系统中的硬盘/卷/分区的程序。使用 Windows 的虚拟磁盘服务来完成此任务似乎是个好主意。

我写了一些代码来尝试一下,但是在链接它时出现以下错误:error LNK2001: unresolved external symbol _CLSID_VdsLoader

微软的示例代码表明我必须链接到 ole32.lib,并且通过谷歌搜索我了解到 uuid.lib 也参与其中。我的项目设置中的“附加依赖项”行如下:

kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)

如您所见,前面提到的两个库都包括在内。

我正在 Visual C++ Express for Windows Desktop 2013 上尝试所有这些。这可能是问题吗?也许 express 版本不支持 100% 的可用 COM 对象?如果不是这样,那还能是什么?

4

2 回答 2

4

此处对此进行了解释:如何使用 DEFINE_GUID 避免错误“LNK2001 unresolved external”,您只需要例如添加#include <InitGuid.h>到您的 stdafx.h 文件中。

于 2013-11-04T12:36:30.263 回答
0

我对未解决的外部 guid 有类似的问题。我没有定义_MIDL_USE_GUIDDEF_宏并试图将代码编译为 C++ 代码。

由于 MIDL 编译器生成 C 源文件来定义 guid,因此它被编译为 C 代码,直到您明确告诉 Visual Studio 将代码编译为 C++ 代码。

MIDL 生成的头文件包含(编译为 C++ 时):

extern "C"
{
    extern "C" const IID iid;   // extern "C" is redundant, extern would be enough
}

MIDL 生成的 guids-definition 文件包含(编译为 C++ 时):

extern "C"
{
    const IID iid = { ... };    // _MIDL_USE_GUIDDEF_ macro is not defined
}

我们需要记住:

extern "C" block implies C name decoration; e.g.
  extern "C" { int a; }

extern "C" singleton implies C name decoration AND extern semantics; e.g.
  extern "C" int a;

in C++ non-extern namespace-scope const object implies internal linkage; e.g.
  const int a;         // internal linkage
  extern const int b;  // external linkage

考虑到这一点,我们可以看到头文件const IID iid使用外部链接和 C 名称修饰进行声明,而 guids-definition 文件const IID iid使用内部链接和 C 名称修饰进行定义。链接不匹配,因此链接器将它们视为不同的实体。在这种情况下const IID iid,外部链接未定义,稍后在同一翻译单元中使用。

当您添加预定义_MIDL_USE_GUIDDEF_的宏 guids-definition 文件将包含:

extern "C"
{
    extern "C" const IID iid = { ... };    // extern "C" is redundant, extern would be enough
}

因此,您需要添加预定义_MIDL_USE_GUIDDEF_的宏才能将代码显式编译为 C++。

于 2017-04-07T14:44:44.000 回答