包含我的BundleController类的头文件多次包含devpkey.h头文件。因此MSVC给出的错误如下;
**Severity Code Description Project File Line Suppression State
Error C2374 'DEVPKEY_Device_Address': redefinition; multiple initialization (compiling source file BundleController.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 66
Error C2374 'DEVPKEY_Device_Address': redefinition; multiple initialization (compiling source file main.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 66
Error C2374 'DEVPKEY_Device_AssignedToGuest': redefinition; multiple initialization (compiling source file BundleController.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 167
Error C2374 'DEVPKEY_Device_AssignedToGuest': redefinition; multiple initialization (compiling source file main.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 167
Error C2374 'DEVPKEY_Device_BaseContainerId': redefinition; multiple initialization (compiling source file Bundlecontroller.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 74
Error C2374 'DEVPKEY_Device_BaseContainerId': redefinition; multiple initialization (compiling source file main.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 74
Error C2374 'DEVPKEY_Device_BiosDeviceName': redefinition; multiple initialization (compiling source file BundleController.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 153
Error C2374 'DEVPKEY_Device_BiosDeviceName': redefinition; multiple initialization (compiling source file main.cpp) C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\devpkey.h 153
.
.
.**我需要多次将devpkey.h头文件包含到我的项目中,如何添加该文件?
项目编译工具为cmake。
发布于 2021-12-29 08:26:04
在这种情况下,总是需要查看代码并尝试理解错误的来源。DEVPKEY_Device_Address (和其他有问题的符号)用DEFINE_DEVPROPKEY宏定义。基于- are INITGUID被定义- DEFINE_DEVPROPKEY扩展为声明或定义。如果未定义INITGUID,则在包含devpkey.h之前(通常这不是直接的,而是由#include <initguid.h>完成的,因为这里存在额外的重要宏),我们将只有DEVPKEY_Device_Address和其他符号的声明,没有实际的定义。因此,我们得到了错误未解决的符号的链接时间。如果在每一个包含devpkey.h之前包含initguid.h .h,我们将有多个符号定义。通常这不能导致错误,因为在符号定义中是DECLSPEC_SELECTANY,这可以扩展到__declspec( selectany )。
告诉编译器声明的全局数据项(变量或对象)是pick--任何COMDAT (打包函数).At链接时间,如果看到一个COMDAT的多个定义,则链接器选择一个,然后丢弃其余的。
但是,如果您得到了错误的__declspec,请看上去不支持/理解C2374 (选择)。
在这种情况下-在任何文件中都需要有声明,其中只在任何一个文件中使用符号和定义。为此,请在选定的源文件中执行以下操作
#include <initguid.h>
// ...
#include <devpkey.h>而在另一个文件中--仅限于
#include <devpkey.h>以前没有#include <initguid.h>
https://stackoverflow.com/questions/70508536
复制相似问题