一、练习环境

Ubuntu18.04 下安装的QT 5.12.0

二、库的生成

1、新建Project —> Library—>C++ 库

Qt for Android创建动态库 qt 生成动态库_qt

2、输入项目名QTLib,可以选择库类型:静态库,动态库,或者qt插件。要创建的是动态库,所以选择共享库

Qt for Android创建动态库 qt 生成动态库_Qt for Android创建动态库_02

3、选择编译器,然后按照个人需求选择相关的模块,我就简单点选择QtWidgets

Qt for Android创建动态库 qt 生成动态库_动态库_03

4、来到这里,目录结构的相关文件就已经建立好了

Qt for Android创建动态库 qt 生成动态库_动态库_04

Qt for Android创建动态库 qt 生成动态库_linux_05

Qt for Android创建动态库 qt 生成动态库_linux_06

5、因为还需要一个ui界面文件,因此上面的qtlib.h和qtlib.cpp还需要重建。喜欢动手的可以看别的资料。我懒  我选择Qt自动创建:右键项目目录—>Add New…—>选择Qt设计师界面类—>界面模板选 Widget

6、注意类名要与原先一样 QTLib,点击下一步,点击完成

Qt for Android创建动态库 qt 生成动态库_qt_07

7、弹出下图提示,点击 ok  ,直接覆盖

Qt for Android创建动态库 qt 生成动态库_qt_08

8、选择 Yes to All

Qt for Android创建动态库 qt 生成动态库_linux_09

9、再次打开qttlib.h和qtlib.cpp文件

Qt for Android创建动态库 qt 生成动态库_linux_10

Qt for Android创建动态库 qt 生成动态库_qt_11

Qt for Android创建动态库 qt 生成动态库_Qt for Android创建动态库_12

10、发现qtlib.h 里 共享库的宏 QTLIBSHARED_EXPORT 和头文件qtlib_global.h 没有了,把它补上

Qt for Android创建动态库 qt 生成动态库_Test_13

11、写个简单的用例,以便后面鉴别是否使用到动态库

ui 文件

Qt for Android创建动态库 qt 生成动态库_Test_14

cpp 文件

Qt for Android创建动态库 qt 生成动态库_linux_15

12、直接编译执行,出现了一堆重复定义的错误,是因为.pro文件里出现了重复定义,把相同的删掉一个就可以了

Qt for Android创建动态库 qt 生成动态库_动态库_16

 

Qt for Android创建动态库 qt 生成动态库_Qt for Android创建动态库_17

13、再次编译执行。因为创建的库文件,所以不会出现界面,弹出下图,直接关掉就行

Qt for Android创建动态库 qt 生成动态库_linux_18

14、去到构建目录,可以看到已经生成了相应的 so 库文件(windows平台最终生成的是dll文件,而linux下则是so文件)

Qt for Android创建动态库 qt 生成动态库_Qt for Android创建动态库_19

三、使用动态库

1、新建一个QT 界面工程Test,ui文件只放一个qwidget 控件,把qtlib.h和qtlib_global.h拷贝到当前工程的文件目录下,包含头文件。(后面再修改动态库工程,qtlib.h有变化的还需及时替换到这里)

Qt for Android创建动态库 qt 生成动态库_Test_20

2、右键添加库—>选择外部库,指定路径。点击下一步,点击完成

Qt for Android创建动态库 qt 生成动态库_linux_21

3、QT 会自动在 .pro 文件 添加一大段内容(就是指定库的路径)

Qt for Android创建动态库 qt 生成动态库_Test_22

4、编写mainwindow.cpp ,简单地使用动态库

Qt for Android创建动态库 qt 生成动态库_Test_23

5、编译运行,出现了一个错误:找不到对应的动态链接库。

但由上面第14步,我们知道是系统是存在libQTLib.so.1文件的

/home/lwz/qt_project/build-Test-Desktop_Qt_5_12_0_GCC_64bit-Debug/Test: error while loading shared libraries: libQTLib.so.1: cannot open shared object file: No such file or directory

Qt for Android创建动态库 qt 生成动态库_动态库_24

6、去到build-Test-Desktop_Qt_5_12_0_GCC_64bit-Debug目录,用ldd 查看了Test相关信息

Qt for Android创建动态库 qt 生成动态库_Test_25

明明存在动态库文件,为什么系统就是找不到呢。百思不得其解之际,突然想到会不会是我动态库所在的路径的问题?

尝试着去看了一下系统动态库的配置文件 /etc/ld.so.conf,发现里面没有libQTLib.so.1所在的路径

7、添加路径并生效配置

在终端执行命令:  sudo vi /etc/ld.so.conf

在最后添加  libQTLib.so.1所在的路径

Qt for Android创建动态库 qt 生成动态库_qt_26

在终端执行命令:sudo ldconfig  ,生效配置文件

8、再次运行程序,成功

Qt for Android创建动态库 qt 生成动态库_Test_27

     

Qt for Android创建动态库 qt 生成动态库_动态库_28

 

注:以上修改系统动态库的配置文件 /etc/ld.so.conf 只是验证问题方法,后续还是要根据个人良好习惯统一整合处理动态库的路径目录等,当然不能每生成一个库就改一次配置文件啦

最后来到这里,不禁有个疑问:这个带界面的库和控件提升有什么区别?

(才开始整QT库,恳请指教,望勿喷)