libusb-1.0在C++下引用
原c#下的项目使用了libusbdonet的库,基于libusb-0.1,官方不再推荐使用,最新版为1.0.22,新旧版本并不兼容
libusb有各种语言下的移植项目,对应c++下项目为?libusbpp 我的项目使用QT+MSVC2017 32bit
关注两个问题
首先是error LNK2001 LNK2019:无法解析的外部符号__imp___iob、__imp__sprintf等等
简单说这个错误的原因是引用的外部库,使用了过时的符号,据信VS2015进行了这样的符号更新,所以当msvc2015或更新的msvc使用早于msvc2015编译的外部库编译时,会引发LNK2001的错误
解决方法有两,硬核方法是针对无法解析的符号,在头文件中引用ms针对此问题推出的legacy_stdio_definitions库并且自定义其他缺少的符号,如下
1 2 3 4 5 6 7 8 |
#pragma comment(lib, "legacy_stdio_definitions.lib") #ifdef __cplusplus FILE iob[] = { *stdin, *stdout, *stderr }; extern "C" { FILE * __cdecl _iob(void) { return iob; } } #endif |
另一种方法就简单多了,只需下载最新的源码,使用与项目相同的msvc重新编译一下就好了。
需要注意的是,混乱的使用编译器版本不是一个好主意。
其次,在解决上一问题后,仍然会报LNK2001/LNK2019错误,不过符号变为了__imp__OpenSCManagerA@12、 __imp__CloseServiceHandle@4、 __imp__OpenServiceA@12等等
直接在头文件中加入对Advapi32.lib的引用即可
1 |
#pragma comment(lib,"Advapi32.lib") |
大佬给力。。两天没解决