包括我的 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。
uj5u.com熱心網友回復:
在這種情況下,總是需要查看代碼并嘗試了解錯誤來源。DEVPKEY_Device_Address(和另一個有問題的符號)用DEFINE_DEVPROPKEY宏定義。基于 - 被INITGUID定義 -DEFINE_DEVPROPKEY擴展為宣告或定義。如果沒有定義INITGUID,在包含devpkey.h之前(通常這不是直接完成的#include <initguid.h>,而是由,因為這里存在額外的重要宏),我們將只有DEVPKEY_Device_Address和其他符號的宣告,沒有實際定義。結果我們得到了錯誤 - 鏈接時未決議的符號。如果在每個包含devpkey.h之前包含initguid.h - 我們將有多個符號定義。通常這不會導致錯誤,因為DECLSPEC_SELECTANY 在符號定義中,可以擴展為 __declspec( selectany )
告訴編譯器宣告的全域資料項(變數或物件)是任意選擇的 COMDAT(封裝函式)。在鏈接時,如果看到 COMDAT 的多個定義,聯結器會選擇一個并丟棄其余的。
但看起來你的編譯器不支持/理解 __declspec( selectany ),如果你得到錯誤C2374
在這種情況下 - 需要在任何檔案中進行宣告,僅在任何檔案中使用符號和定義。為此在某些選定的源檔案中做
#include <initguid.h>
// ...
#include <devpkey.h>
并在另一個檔案中 - 僅
#include <devpkey.h>
沒有#include <initguid.h>之前
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/396805.html
上一篇:如何在“Button.image或pictureBox.ImageLocation”中獲取圖示程式
下一篇:Windows11/MinGW64位:QT應用程式不是從“C:/ProgramFiles”開始,而是從其他任何地方開始
