• libusb系列-007-Qt下使用libusb1.0.26源码


    头图

    libusb系列-007-Qt下使用libusb1.0.26源码


    关键字: DebianLinuxQtlibusb源码

    内容背景:

    最近项目终于切到Linux下开发了,所以最近的记录都是发生在Debian 10 以及Arm Debain 10 下,Qt版本5.12.3。这几天真是问题多多,收获满满,不过目前阶段仅仅停留在解决问题,至于原理性的东西,还得慢慢消化。最近好多问题都是直接群里问大神,感谢各位大神助我成长。

    开始本来USB传世使用的是HIDUSB,后面计划开发一个专用的驱动,到最后,因为最终系统一直定不下来,最终成了使用libusb了。大部分人都是直接使用libusb 的库的,把源码直接放在项目中参与编译的应该很好,哎,我就是那个大冤种,那么请跟随我一起看我如何给自己完坑踩坑吧。

    摘要

    哎呀,终于轮到我写我踩的大坑了。这里要贴出我领悟到的重大人声哲理。

    其实,所谓的困难,都是我们自己。

    其实我最开始接触libusb的时候,就有把libusb源码搞进项目里的想法,因为前面使用QCustomPlot库 CJSON库``HUDUSB库都是直接包含一个头文件和一个源码即可完成源码的引入,那么到libusb库的时候,我就有了同样的想法了,但是当我打开libusb库的源码包是,是直接闷逼的状态,所以当场就点击了右上角的X

    第二次是尝试编译lib库,结果还是一地鸡毛,找了好几个教程,都是没有成功,所以再次点击右上角的X

    第三次,尝试直接把源码放在Qt里面编译,不错所料,好几百个错误,又一次点击右上角X

    第四次,准备好好研究一番再搞。终于算是成功了吧,1.0.9 顺利整合到源码中,1.0.26 在Demo里面测试可以了初始化USB了,不过我注视掉了部分时间相关的函数,应该会有部分问题,应该还是少了那个库所致,暂时只能到这里,因为我项目中原来使用的库就是1.0.9 所以这源码也是1.0.9 的,保持下一致性。

    安装编译环境

    这个环节看是很数次,其实就是在第三篇文章libusb系列-003-Linux下libusb源码编译的一部分,因为我们需要通过make 知道linux,需要那些源码。所以需要安装编译环境

    sudo apt install -y make dh-autoreconf
    sudo apt install -y libudev-dev
    
    • 1
    • 2

    确认需要的文件

    这里就要切到libusb系列-003-Linux下libusb源码编译,找一张图一下都需要什么文件。

    image-20221021222241205

    按照上面的内容,把需要的源码文件添加到Qt工程中。

    image-20221022162016507

    开始编译

    接着按照理想的进度,应该是我们点击Qt Creator中的Buil按键,等待绿条走完,就可以了大功告成了,

    错误1:找不到文件

    命名已经包含了,结果还是找不到文件如下图所示

    image-20221022162308439

    这个问题其实还是很好解决的,改下包含路径即可。这个步骤需要循环操作好多次,直到没有了对应的报错。

    错误2:expected

    额,这个错误我也不知道该怎么形容,反正就是好导出宏有关系。如下图所示

    image-20221022180330012

    因为我们要直接使用源码,没有导出一说了,所以我就把导出宏删除了,这个也要循环操作好多轮,直到没有再说。

    错误3:SCM_CREDENTALS

    说是这个宏没有定义 SCM_CREDENTALS

    image-20221022180749034

    这个就要找对应的宏定义,一路找上去,最后会发下如下图所示的定义,所以只需要在对应的宏使用的地方增加一个宏 __USE_GNU_

    image-20221022180824380

    image-20221022181022107

    百度也有其他的方法,我测试不好使,上面是我测试好使的,可能和系统有关。百度内容如下

    image-20221022181038355

    错误4:类型冲突

    这个是翻译过来的,这个问题我到现在其实也没有解决,只是我把对应的实现给注释掉了,具体影响未知,也期待大佬评论区指点一波

    报错内容如下

    image-20221022181233748

    找遍整个项目,也只有3个地方出现,不存在冲突呀

    image-20221022181305777

    解决这个问题,也尝试过加 extern "C",但是无解,报错依旧

    image-20221022181349868

    错误5 assert断言错误

    这个更是找不到解决方法,报错如下,都断言错误。

    image-20221022181439909

    字面意思都是未定义,但是我真的可以向上找到定义。

    image-20221022181530919

    所以,我理解的断言就是类似抛出异常被,所以我就不抛出了,直接注释掉。如下图所示

    image-20221022181620206

    错误6:关于时间的错误

    这个同样,我的解决方法就是注释掉使用的地方,这个应该是我没有引用到那个系统的库,应为我跳到对应的函数接口,注释都是写着如果系统不提供,就自己实现他。所以我就注释掉了,但是其实应该是有一个库可以提供这些代码的,示例如下

    image-20221022181833584

    也是一样,循环操作,直到没有报错,如果到这里,你都解决完了,那么应该就是可以编译过了。

    测试libusb

    测试代码如下,其实也是就一行

    image-20221023095843836

     qDebug() << libusb_init(NULL);
    
    • 1

    测试结果如下

    image-20221023095811017

    工程源码

    Debian 10 下 Qt 5.12.3 使用libusb 1.0.26源码工程示例

    那么我注释掉这些东西,不知道对整个库是否有印象,所以还希望大佬们在评论区指正呀。


    博客签名2021
  • 相关阅读:
    java web学习总结
    Redis学习笔记
    Go语言基础之基本语法
    Docker以标准方式安装部署Redis
    低代码助力企业数字化转型
    SpringBoot--中间件技术-4:整合Shiro,Shiro基于会话SessionManager实现分布式认证,附案例含源代码!
    交换机之trunk access hybrid 以及vlan深入理解
    深入理解Linux内核内存池技术的原理与实现(含源代码)
    Java面试知识点(八十一)Spring的IOC和AOP概念和实现原理
    JSP工作原理
  • 原文地址:https://blog.csdn.net/z609932088/article/details/127928949