QT共享库的创建与调用(初级)

  背景:

  最近在做的一个项目其中一部分既是实现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为项目名称。)

  两个.h文件区别暂未研究。我只在.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,程序应该就可以正常运行并成功调用共享库了。

参考文章:
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

以下为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"文件的设定。

附:

  在使用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即可完成链接。


记录地点:深圳维准科技

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

时间: 2024-10-25 03:00:24

QT共享库的创建与调用(初级)的相关文章

Qt 共享库(动态链接库)和静态链接库的创建及调用

前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sharedlib) 生成的目录结构如图: 修改 sharedlib.h 中的代码: // sharedlib.h #ifndef SHAREDLIB_H #define SHAREDLIB_H #include "sharedlib_global.h" class SHAREDLIBSHAR

一个简单的C共享库的创建及python调用此库的方法

/*********************************************************************  * Author  : Samson  * Date    : 02/02/2015  * Test platform:  *              3.13.0-24-generic  *              GNU bash, 4.3.11(1)-release  * ************************************

VC++6.0 动态库的创建与调用(非MFC的dll)

非MFC动态库的创建... 一个lib.cpp,一个lib.h /*lib.h*/ #ifndef LIB_H #define LIB_H //声明add为dll的导出函数. extern "C" int _declspec(dllexport)add(int x,int y); #endif 也可以加上def文件 ; lib.def : 导出DLL函数 LIBRARY DllTestDef EXPORTS add @ 1 非MFc动态库的调用 1.静态调用 //静态的调用dll动态库

动态库的创建和调用

(一)动态链接库和静态链接库 静态链接库:lib中的函数不仅被连接,全部实现都被直接包含在最终生成的EXE文件中,只是实现是不可见的. 动态链接库:dll不必被包含在最终的EXE中,静态调用时仅把函数名或者变量名或者类名链接到EXE文件中,而这些东西的实体都只有在运行时才从动态库中导入到可执行文件中,动态调用的时候EXE文件执行时可以直接动态地引用和卸载DLL文件. 同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库. (二)回顾一下VC++支持的DL

共享库文件ldconfig 配置导致*.so找不到

error whilel oading shared libraries:libluajit-5.1.so.2: cannot open shared解决办法 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory 原因一般有两个

共享库加载时重定位

原作者:Eli Bendersky http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries 本文的目的是解释现代操作系统怎样使得共享库加载时重定位成为可能.它关注执行在32位x86的LinuxOS.但通用的原则也适用于其它OS与CPU. 共享库有很多名字--共享库,共享对象,动态共享对象(DSO),动态链接库(DLL--假设你有Windows背景).为了统一起见.我将尽量在本文里使用"共享库

共享库C/C++

共享库---共享对象的集合 1.产生原因 随着软件规模的越来越大,我们的函数越来越多,为了简化这些极为庞大的共享对象.所以就将这些函数根据相应的需求规划成一些集合,进行一些处理生成共享库文件,这样可以极大的减少函数的数量便于管理和升级. 2.共享库的版本 更新: 兼容更新.所有的更新只是在原有的共享库基础上添加一些内容,所有的接口都保持不变. 不兼容跟新.改变了所有的原有接口,更新后原有的程序可能不能运行 就是ABI 接口改变,一般二进制接口改变,程序是不能运行的. 3.ABI改变情况以及兼容性

共享库载入时重定位

原作者:Eli Bendersky http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries 本文的目的是解释现代操作系统如何使得共享库载入时重定位成为可能.它关注运行在32位x86的LinuxOS,但通用的原则也适用于其他OS与CPU. 共享库有许多名字--共享库,共享对象,动态共享对象(DSO),动态链接库(DLL--如果你有Windows背景).为了统一起见,我将尽量在本文里使用"共享库

静态库和共享库制作

 1静态库和共享库 *本节就如何创建和使用程序库进行论述.所谓"程序库",简单说,就是包含了数据 和执行码的文件.其不能单独执行,可以作为其它执行程序的一部分来完成某些功能.库的 存在,可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便 于升级.程序库可分静态库(static library)和共享库(shared object). A:静态库 是在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分:共享库,是在 执行程序启动时加载到执行程序中,可以