Visual Studio 为什么链接器在c++中找不到这个局部定义

a5g8bdjr  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(107)

我有这个代码:

// 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


为什么我会得到这个错误?

oxf4rvwz

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变量进行多个声明。

相关问题