无法解析的外部符号_CLSID_VdsLoader
我在编写一个程序,可以管理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对象?如果不是这样,那还有什么呢?
这是在这里解释:How to avoid error "LNK2001 unresolved external" by using DEFINE_GUID,你只需要例如在您的stdafx.h文件中添加#include <InitGuid.h>
。
我有类似的问题与未解决的外部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_
宏。
刚试过包括它,我仍然得到相同的错误。感谢您的尝试。 – Jehjoa
我已经更新了我的答案 –
现在它的工作原理!非常感谢! – Jehjoa