我对未解决的外部 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++。