QT共享库的创建与调用(初级)(附:UI界面不能被改变的其中一个原因)

  背景:

  最近在做的一个项目其中一部分既是实现PC与下位机的USB通信。windows平台下已经完成,现需移植到linux平台下。

  在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再详述),并以hidraw类设备节点存在于系统中"/dev/"下。上位机则成功在console中通过调用HIDAPI库来写入、读取hidraw设备节点信息(后续再详述),而进一步的图形界面则需由QT来完成。

hidraw设备介绍:

  https://www.kernel.org/doc/Documentation/hid/hidraw.txt

HIDAPI介绍:

  https://valelab.ucsf.edu/svn/3rdpartypublic/hidapi/hidapi-3a66d4e513/README.txt

  现在的问题是,对于客户来说,他们并不需要"raw"设备节点,而是需要已被加工过、能被现成调用并能直观控制下位机的API。所以,制作QT共享库成为我的下一步工作。

  共享库的好处在于,若共享库实现的功能需要更改,不需要大面积的更改主函数,只需更改共享库即可。

  

  正文:

QT共享库的制作如下:

  首先Create Project --> 选择Other Project --> C++ Library --> ... -->  默认选择QTCore(其他暂未研究)。  

  最后生成xxx_global.h, xxx.h, xxx.cpp文件。(xxx为项目名称。)

  xxx_global.h文件里面宏定义了共享库的一些基本属性,

#include <QtCore/qglobal.h>

#if    defined(XXX_LIBRARY)
#    defined    XXX_EXPORT    Q_DECL_EXPORT
#else
#    defined    XXX_EXPORT    Q_DECL_IMPORT
#endif

#endif    //    XXX_GLOBAL_H  

  点开看有没有很熟悉,DLL也有类似的代码段,具体作用暂未研究。

  而我只在.h文件包含了HIDAPI头文件,并在其默认类里面声明了一个公共的USBOpen()函数及一些变量。然后在USBOpen()函数里调用了打开hidraw设备函数。

  此时点击build(不是Run!)则可在build-xxx-Desktop-Debug文件夹中生成一个xxx.so共享库文件,和几个指向该.so库文件的软链接。

  由于我需要使用HIDAPI的库所以还需要再做以下步骤,

  在".pro"文件里添加

  LIBS  += -L .usr/local/lib/ -lhidapi-libusb  (即共享库所在位置及共享库名称)

  至此,共享库制作完毕。

 

调用共享库步骤如下:

  新建一个新工程。

  在".pro"文件添加

  HEADERS += /home/aplex/usbapi  (即共享库头文件所在位置)  --->usbapi为我的共享库项目名称

  LIB    += -L /home/aplex/build-usbapi-Desktop-Debug/ -lusbapi(注意,此处应为项目名称,而不是共享库文件名称!)

  在主函数中定义一个共享库内的类,并调用USBOpen()函数;build,成功!点击Run,然而见证奇迹的时刻并没有出现,取而代之的是一个错误提示:

  error while loading shared libraries: xxx.so.1 can not open shared object file : No such file or directory。

  借用一句大牛说过的话:有提示的错误那都不能算是错误!哈~

  不过,为了解决这个错误也确实卡了我一点时间,后来查资料得知,原来run也有它的链接路径。解决办法既是:

  点击QT左边工具栏的Projects --> RunSetting,找到Run Environment,点击Details --> 找到以下的值,没有则自行添加

  Variable: LD_LIBRARY_PATH  

  Value:这个值一般已经有了默认库的路径,且每个路径以":"分隔开,在其末尾添加你的库所在路径即可,注意:在最后记得加上":"!

  点击RUN,程序应该就可以正常运行并成功调用共享库了。

 

其他人如何调用此共享库:

  首先,我们需要做的工作是,

  1、将自己的共享库由Debug版本发布成Release-->在QT侧边栏'RUN'按钮之上有一个Desktop,改为'QT in PATH Release'; 接着点击'RUN'重新运行;

  2、进入'xxx-build-desktop'文件夹内,将所有的'.so'文件(文件与软连接)使用 tar 命令打包成'.tar.bz2'文件(这么做的作用是,不至于在复制的时候,破坏这些文件的默认属性,可以做个实验,若是直接拷贝,则软链接文件会在拷贝后,直接变成普通文件)。

    进入'xxx'文件内,将所有的'.h'文件使用 tar 命令打包成'.tar.bz2'文件。

  接着,其他人若要调用此共享库,只需做如下步骤:

  1、将两个'.tar.bz2'文件分别使用 tar 命令解压到'/usr/local/lib/', '/usr/local/include/'文件夹内;

  2、更新库文件信息--> sudo ldconfig

  3、在QT的'.pro'文件添加如下代码段

    LIBS  += -L .usr/local/lib/ -lxxx  (xxx为共享库名称)

  至此,即可在他人的电脑上调用我们自己的共享库了。

参考文章:

How to create a library with Qt and use it in an application

  https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application

Linux下Qt创建和调用共享库文件.so

  http://www.librehat.com/linux-qt-to-create-and-call-a-shared-library-so-file/

Building C++ shared libraries in Qt Creator (cross-platform)

  https://blog.g3rt.nl/building-cpp-shared-libraries-qt-creator.html

 

附1:

  无论怎么更改UI界面,点击'RUN'后,生成的UI却没有任何变化?

  点击左侧的“Projects”,在Build Settings 内,将对应的选项进行更改。

 

附2:

  以下为hidapi共享库调用出现的问题:

  由于hidapi的调用需要root权限,直接点击run的话会无法打开hidraw设备。所以只能生成可执行文件,以sudo来运行。 

  前文已说明,主程序调用的是我自己的共享库,然后在共享库内调用HIDAPI库实现对hidraw设备的操作。现在使用sudo来打开主程序的可执行文件出现如下报错:

  error while loading shared libraries: xxx.so.1: can not open shared object file:No such file or directory。  

  出现这种错误,一般解决办法即是更改 ".pro" 文件,告诉QT,共享库文件在哪。可是之前已经做过了,还是报错问题在哪呢?

  做个测试,将主程序由调用我创建的共享库更改为直接调用HIDAPI共享库,并生成可执行文件,使用sudo,打开hidraw设备正常。说明还是共享库路径寻找出现了问题。

  于是乎,我将.so文件拷贝到 /usr/local/lib/ 文件夹下,

  并运行 sudo ldconfig;

  再次运行之前生成的可执行文件,正常运行。所以说,即使更改了".pro"文件,生成的执行文件还是去系统默认的共享库存放位置查找,而不是按照".pro"文件的设定。

 

附3:

  在使用ldconfig的过程中,出现了报错:

  /sbin/ldconfig.real: /usr/local/lib/xxx.so.1 is not a symbolic link。

  查找资料得知,xxx.so xxx.so.1 xxx.so.1.0 均是xxx.so.1.0.0的软链接,而我是从其他地方拷贝过来,软链接文件属性全部变成了普通文件属性,导致无法链接。

  正确做法只需将.so拷贝进/usr/local/lib下,接着运行ldconfig即可完成链接。

 


记录地点:深圳WZ

记录时间:2015年12月7日 19:27:18

修正时间1:2015年12月22日 14:51:52

 

转载于:https://www.cnblogs.com/ChYQ/p/5027252.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值