在未使用第三方相机库时,项目正常使用setupapi.h,但导入第三方相机库后编译报错,提示以下错误:
serialenum.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiEnumDeviceInfo@12,该符号在函数 "public: void __thiscall CamSerialEnum::GetHardwareList(void)" (?GetHardwareList@CamSerialEnum@@QAEXXZ) 中被引用 serialenum.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiDestroyDeviceInfoList@4,该符号在函数 "public: void __thiscall CamSerialEnum::GetHardwareList(void)" (?GetHardwareList@CamSerialEnum@@QAEXXZ) 中被引用 serialenum.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetClassDevsW@16,该符号在函数 "public: void __thiscall CamSerialEnum::GetHardwareList(void)" (?GetHardwareList@CamSerialEnum@@QAEXXZ) 中被引用 serialenum.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetDeviceRegistryPropertyW@28,该符号在函数 "bool __cdecl GetDeviceProperty(void *,struct _SP_DEVINFO_DATA *,unsigned long,wchar_t *,unsigned long,unsigned long *)" (?GetDeviceProperty@@YA_NPAXPAU_SP_DEVINFO_DATA@@KPA_WKPAK@Z) 中被引用
是因为使用第三方相机前需要安装它的驱动,项目在引入它的SDK库时,第三方相机也使用到了setupapi.h,而第三方相机使用的是编译到自己驱动里面去的Setupapi.lib(可能版本太老或屏蔽了部分接口),这导致项目中使用setupapi.h也找到了相机的驱动,导致无法定位到相应的函数。
解决办法:在项目中使用setupapi.h的地方加下面这句代码即可:
#pragma comment(lib, "Setupapi.lib")
注:上面这种方式可能在windows11或者其他mingw版本上不生效,那么可以在.pro文件中添加如下配置。
LIBS += -lSetupapi