2013-11-04 145 views
3

我在编写一个程序,可以管理Windows系统中的硬盘/卷/分区。这似乎是一个好主意,使用Windows的虚拟磁盘服务来实现这一点。无法解析的外部符号_CLSID_VdsLoader

我编写了一段代码,尝试一下,但链接时,我得到以下错误:error LNK2001: unresolved external symbol _CLSID_VdsLoader

微软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

我有类似的问题与未解决的外部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生成的GUID定义文件包含(当编译为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定义文件定义了const IID iid与内部链接和C名称装饰。链接不匹配,因此链接器将它们视为不同的实体。在这种情况下,带有外部链接的const IID iid未定义,稍后在相同的翻译单元中使用。

当您添加预定义_MIDL_USE_GUIDDEF_宏观的GUID定义文件将包含:

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

所以,你需要以明确的代码编译为C++添加预定义_MIDL_USE_GUIDDEF_宏。