我正在尝试编写一个可以管理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 对象?如果不是这样,那还能是什么?
这在这里解释:如何使用 DEFINE_GUID 避免错误“LNK2001 unresolved external”,您只需在 stdafx.h 文件中添加
#include <InitGuid.h>
即可。
我也遇到了类似的未解决的外部指南问题。我没有定义
_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 名称修饰,而 guid 定义文件定义 const IID iid
具有内部链接和 C 名称修饰。链接不匹配,因此它们被链接器视为不同的实体。在这种情况下,具有外部链接的 const IID iid
未定义,稍后在同一翻译单元中使用。
当您添加预定义的
_MIDL_USE_GUIDDEF_
宏向导定义文件将包含:
extern "C"
{
extern "C" const IID iid = { ... }; // extern "C" is redundant, extern would be enough
}
因此您需要添加预定义的
_MIDL_USE_GUIDDEF_
宏才能将代码显式编译为 C++。