我有这个代码:
// Include guiddef.h
#include <guiddef.h>
// Define GUID
DEFINE_GUID(MyGuid,
0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0);
int main() {
// Initialize variable with defined GUID
GUID guid = MyGuid;
// Can also directly use MyGuid
return 0;
}
字符串
当我使用VS 2022,17.6.5编译它时,我得到了这个链接器错误:
Error LNK2001 unresolved external symbol MyGuid testApplication 1
型
为什么我会得到这个错误?
1条答案
按热度按时间oxf4rvwz1#
DEFINE_GUID
使用了一种在C中工作但在C中不工作的半丑陋的技巧。当您使用
DEFINE_GUID
时,它会在其生成的代码的开头添加一个extern
。在C语言中,这是相当无害的--你最终得到了一个所谓的“临时定义”。临时定义是声明和定义之间的中间点。一方面,您可以对同一个名称进行多个尝试性定义,只要它们不冲突(比如尝试给予它不同的类型),就没问题。但如果没有非试验性的定义可见,它也将充当定义。在C中最接近的等价物是
inline
变量定义(它也可以有多个出现,只要它们不冲突,并且它们最终都解析为单个对象)。但是,就目前的情况而言,宏扩展为在开始时包含extern
的东西,在C中,这严格来说是一个声明,而不是定义,所以当/如果你试图在C中使用它时,你在任何地方都没有定义,链接失败。参考
https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/defining-and-exporting-new-guids
将GUID定义放在防止多重包含的语句之外不会导致驱动程序中存在GUID的多个示例,因为DEFINE_GUID将GUID定义为EXTERN_C变量。只要类型匹配,就允许对EXTERN变量进行多个声明。