linux下Qt动态库创建与调用学习笔记一(静态加载)

    这是篇老话题了,正好我这几天需要学习Qt动态库创建和使用的方法,在网上搜索了很多帖子,非常详细和充实,但是在一些细节上说的不够仔细,下面将我自己的学习过程赘述下来,供后来者参考。我使用的环境是CentOs 7 以及Qt .8。文中可能有很多与网上帖子相似之处,请见谅。本篇所采用的步骤是静态加载库文件,切记。

1.动态库创建与使用总结

1.1 基本动态库创建

1.1.1 新建

   

 步骤一:点击Qt Creator菜单栏“文件”-->“新建文件或项目”,选择Library,C++库,点“choose”。

1.1.2 设置项目类型、名称及存放路径

步骤二:类型中可以选择“共享库”、“静态链接库”、“Qt plugin”,三个选项,这里开发动态库,选择共享库选项;设置共享库名称,这里设立项目名称为MyLib;创建路径按照自己的项目存放位置设置。设置好后,点“下一步”即可。

1.1.3 构建套件(kits)设置

 

步骤三:按照系统默认设置即可,除非自己需要改变编译等配置;直接 点“下一步”即可。

1.1.4 构建模块选择

 

 步骤四:依据开发需要,选择相应的模块,点“下一步”即可。如果在这里忘记添加所需的模块,后续在项目.pro文件中也可以添加。

1.1.5 类信息设置

 

步骤五:设置动态库主类名称。 点“下一步”即可。

1.1.6 项目管理设置

 

 步骤五:进行项目管理内容设置,如果需要进行版本控制可以进行设置,否则点“完成”即可。至此动态库创建完毕。后续即可将所需实现功能写入动态中。

1.1.7 动态库类简单功能实现

    

      创建后,Qt Creator自动生成三个文件分别是mylib_global.h、qmylib.h、qmylib.cpp。其中mylib_global.h是一个宏定义文件,其内容如下图所示:


图中标蓝的部分,可以拷贝至qmylib.h中,同时将mylib_global.h删除掉,这样项目也可以直接编译使用,不删除也没有问题,只是使用时,使用程序需要同时将mylib_global.h、qmylib.h包含。标蓝部分拷贝到qmylib.h中的位置如下图所示:


    简单在此库中实现一个功能,返回一个字符串。


    编译后得到四个库文件,如下图:

 

     至此动态库创建完毕。

2.2动态库调用

2.2.1 创建工程

    创建工程与正常创建工程的步骤一致,按照自己需求建立,这里创建一个基于QDialog的对话框,工程名为MyTest; 创建后项目如下图: 


2.2.2 配置.pro文件倒入库文件

    添加库文件的方法很多,具体来说是两种:一个是在.pro文件中右键菜单中选择添加库,具体方法网络上很多。二是自己设定.pro文件中LIBS的配置,指定库文件位置。LIBS指定库的三种配置方式及具体说明如下:

1) LIBS += -L$$PWD/lib -lMyLib

    表示编译时需要链接库文件,库文件放在当前工程源码目录下($$PWD,就是表示当前工程源码所在目录)lib文件夹下。-l MyLib表示动态库文件名是什么。MyLib依据动态库工程名不同而不同,记住是工程名,而不是动态库文件名,实际上动态库文件名是libMyLib.so。实际使用时,依据动态库项目名称而对 MyLib进行修改。

2) LIBS += -L./lib -lMyLib

    表示编译时需要链接库文件,库文件放在当前工程编译目录下lib文件夹下。-l MyLib表示动态库文件名是什么。MyLib依据动态库工程名不同而不同,记住是工程名,而不是动态库文件名,实际上动态库文件名是libMyLib.so。实际使用时,依据动态库项目名称而对 MyLib进行修改。

3) LIBS +=  ./lib/libMyLib.so

表示编译时所需要的链接库文件,库文件放在当前工程编译目录下lib文件夹下,动态库文件的文件名是libMyLib.so。libMyLib.so是linux系统下动态库的全称。注意,在这种编译模式下,编译可以顺利通过,但是实际调试或运行时会出现“cannot open shared object file: No such file or directory”的错误,原因是“LIBS +=   ./lib/libMyLib.so”的作用仅仅时指定编译期间动态库所在位置,而程序运行期是按照环境变量来搜索库文件的位置,这个可按照“1. cannot open shared object file”的解决方法的解决措施来解决。

    在本项目中采用LIBS += -L./lib-lMyLib的配置,即将四个库文件放置在MyTest工程编译目录下的lib文件夹内,同时将。配置如下图所示:


    另外,将库头文件qmylib.h拷贝到MyTest源文件目录中,并在qmytest.h头文件中包含。至此之前编写的MyLib动态库已成功的添加到MyTest中,可以顺利使用了。后续使用不再赘叙。我在此只是在MyTest中测试了Mylib中getName函数而已,其效果如下:

 

3 小结

    1)在centos,Qt5.8环境下测试,发现LIBS参数设置时,如果采用1)2)两种方式进行动态库位置制定,编译可以顺利通过,调试时也不会出现“cannot open shared object file: No such file or directory”的错误;只有3)直接指定库文件名称(即将.so文件全称写入)这种编译时可以通过,但是调试时会出现“cannot open shared object file: No such file or directory”的错误。

    2)采用以上三种方法进行程序编译,编译后直接运行编译后的可执行文件(非调试模式),均会发生“cannot open shared object file: No such file or directory”的错误。可以将动态库文件直接放置到/usr/local/lib中,或者自建一个目录如/usr/mylib将动态库放置其中,同时将/usr/mylib加入到/etc/ld.so.conf文件中,再在终端中执行ldconfig –v命令即可。这样可执行文件无论在哪儿均可顺利执行。

    3)进行项目开发时建议采用第1)2)两种动态库配置方式,这样方便调试。



  • 5
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值