一、练习环境
Ubuntu18.04 下安装的QT 5.12.0
二、库的生成
1、新建Project —> Library—>C++ 库
2、输入项目名QTLib,可以选择库类型:静态库,动态库,或者qt插件。要创建的是动态库,所以选择共享库
3、选择编译器,然后按照个人需求选择相关的模块,我就简单点选择QtWidgets
4、来到这里,目录结构的相关文件就已经建立好了
5、因为还需要一个ui界面文件,因此上面的qtlib.h和qtlib.cpp还需要重建。喜欢动手的可以看别的资料。我懒 我选择Qt自动创建:右键项目目录—>Add New…—>选择Qt设计师界面类—>界面模板选 Widget
6、注意类名要与原先一样 QTLib,点击下一步,点击完成
7、弹出下图提示,点击 ok ,直接覆盖
8、选择 Yes to All
9、再次打开qttlib.h和qtlib.cpp文件
10、发现qtlib.h 里 共享库的宏 QTLIBSHARED_EXPORT 和头文件qtlib_global.h 没有了,把它补上
11、写个简单的用例,以便后面鉴别是否使用到动态库
ui 文件
cpp 文件
12、直接编译执行,出现了一堆重复定义的错误,是因为.pro文件里出现了重复定义,把相同的删掉一个就可以了
13、再次编译执行。因为创建的库文件,所以不会出现界面,弹出下图,直接关掉就行
14、去到构建目录,可以看到已经生成了相应的 so 库文件(windows平台最终生成的是dll文件,而linux下则是so文件)
三、使用动态库
1、新建一个QT 界面工程Test,ui文件只放一个qwidget 控件,把qtlib.h和qtlib_global.h拷贝到当前工程的文件目录下,包含头文件。(后面再修改动态库工程,qtlib.h有变化的还需及时替换到这里)
2、右键添加库—>选择外部库,指定路径。点击下一步,点击完成
3、QT 会自动在 .pro 文件 添加一大段内容(就是指定库的路径)
4、编写mainwindow.cpp ,简单地使用动态库
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
6、去到build-Test-Desktop_Qt_5_12_0_GCC_64bit-Debug目录,用ldd 查看了Test相关信息
明明存在动态库文件,为什么系统就是找不到呢。百思不得其解之际,突然想到会不会是我动态库所在的路径的问题?
尝试着去看了一下系统动态库的配置文件 /etc/ld.so.conf,发现里面没有libQTLib.so.1所在的路径
7、添加路径并生效配置
在终端执行命令: sudo vi /etc/ld.so.conf
在最后添加 libQTLib.so.1所在的路径
在终端执行命令:sudo ldconfig ,生效配置文件
8、再次运行程序,成功
注:以上修改系统动态库的配置文件 /etc/ld.so.conf 只是验证问题方法,后续还是要根据个人良好习惯统一整合处理动态库的路径目录等,当然不能每生成一个库就改一次配置文件啦
最后来到这里,不禁有个疑问:这个带界面的库和控件提升有什么区别?
(才开始整QT库,恳请指教,望勿喷)