我正在尝试编写一个可以管理Windows系统中的硬盘/卷/分区的程序。使用Windows的虚拟磁盘服务来实现这一目标似乎是一个好主意。
我写了一些代码来试用它,但是在链接它时我收到以下错误:error LNK2001: unresolved external symbol _CLSID_VdsLoader
Microsofts sample code表示我必须链接到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)
如您所见,前面提到的两个库都包括在内。
我在Windows桌面2013的Visual C ++ Express上尝试所有这些。这可能是问题吗?也许快递版本不支持100%的可用COM对象?如果那不是它,还有什么呢?
答案 0 :(得分:4)
这里解释了这一点:How to avoid error "LNK2001 unresolved external" by using DEFINE_GUID,您只需要在stdafx.h文件中添加#include <InitGuid.h>
。
答案 1 :(得分:0)
我对未解决的外部指导有类似的问题。我没有定义_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
考虑到这一点,我们可以看到头文件使用外部链接和C名称修饰声明const IID iid
,而guids-definition文件定义const IID iid
内部链接和C名称修饰。链接不匹配,因此链接器将它们视为不同的实体。在这种情况下,具有外部链接的const IID iid
未定义,稍后将在同一个翻译单元中使用。
当您添加预定义的_MIDL_USE_GUIDDEF_
宏guids时,定义文件将包含:
extern "C"
{
extern "C" const IID iid = { ... }; // extern "C" is redundant, extern would be enough
}
因此,您需要添加预定义的_MIDL_USE_GUIDDEF_
宏,以便将代码显式编译为C ++。