QT带界面的动态库
创建动态库
一、新建一个C++的动态库的项目
选择C++的动态库的项目,进行下一步
修改项目的名字和项目的保存的路径。
选着编译的方式,不需要改,进行下一步。
选着动态库,编译成动态库,进行下一步。
项目中会自动的生成这些文件,点击完成。
看一下自动生成的文件
-
.pro
QT -= gui #增加的模块 TEMPLATE = lib #编译成库文件 DEFINES += LOGIN_LIBRARY #库文件的名字 CONFIG += c++11 DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ login.cpp HEADERS += \ LogIn_global.h \ login.h # Default rules for deployment. unix { target.path = /usr/lib } !isEmpty(target.path): INSTALLS += target
-
_global.h
#ifndef LOGIN_GLOBAL_H #define LOGIN_GLOBAL_H #include <QtCore/qglobal.h> #if defined(LOGIN_LIBRARY) # define LOGIN_EXPORT Q_DECL_EXPORT #else # define LOGIN_EXPORT Q_DECL_IMPORT #endif #endif // LOGIN_GLOBAL_H
这里定义了符号DLL_EXPORT用于替代Qt的宏Q_DECL_EXPORT或Q_DECL_IMPORT。
可以到符号DLL_EXPORT,就是我们开始给起的项目的名字,我们需要在我们需要输出的地方使用这个宏来输出可以使用的对象。比如一个类,一个函数等。
注意:有时候我们看到文件输出了.dll,但是没有文件.lib,就是没有使用这个宏去输出我们的文件。
一个共享库导出给用户使用的类、符号、函数等都需要用宏Q_DECL_EXPORT来定义导出,一个使用共享库的应用程序需要通过Q_DECL_IMPORT导入共享库里的可用对象。
注意:在需要导出的类,导出函数的地方需要增加*_EXPORT的这个宏,不然在动太库的导出中就会缺失*.lib文件。
-
.h
#ifndef LOGIN_H #define LOGIN_H #include "LogIn_global.h" class LOGIN_EXPORT LogIn { public: LogIn(); }; #endif // LOGIN_H
增加了一行#include “*_global.h”。
二、编写代码
根据自己的需求,编写自己的的动态库的函数和类,在需要导出的地方需要增加导出的宏。才能导出到*.lib文件中,可以根据自己的需要导出,就可以避免了访问。
三、构建动态库项目
生成动态库的项目事不需要进行执行的,只要能够构建成功就可以了。
注意:如果自己动态库中包含了资源文件,那么动态库就可以直接访问了,不管是动态库还是静态库,后面都不需要原始的资源文件了。
自己使用动态库的版本的信息一定要跟构建时候的信息一致,不然会出现无法打开.lib文件等错误。
构建完成之后,可以在自己的构建的目录中查看生成的动态库的文件。
生成了.dll文件和.lib文件。
四、使用动态库
动态库的隐式调用
隐式链接调用主要用于同一种编程软件(如Qt)生成的代码的共享。
需要的文件:.h文件 _global.h文件 .lib文件,放到项目的include目录下,.dll动态库放到可执行的文件目录下。
在.pro文件中增加进去动态库的链接:一、可以通过界面上的操作进行库的增加。二、直接在.pro中,自己手动的增加和指定库的的路径。如LIBS += -L$$PWD/./ -l(库的名字)
动态库的显示调用
需要的文件: .dll文件
显式链接调用是只有DLL文件,知道DLL里的函数原型,使用QLibrary类对象在应用程序里动态加载DLL文件,声明函数原型,并使用DLL里的函数。这种方式需要在应用程序里声明函数原型,并解析DLL里的函数。
void MainWindow::on_pushButton_clicked()
{
QLibrary myLib("DelphiDLL"); //加载动态库文件
if (myLib.isLoaded()) //判断动态库是否已经加载了
QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第1处");
typedef int (*FunDef)(int); //声明函数的原型
FunDef myTriple = (FunDef) myLib.resolve("triple"); //解析DLL中的函数 查找函数”triple“
int V=myTriple(ui->spinInput->value()); //调用函数
ui->spinOutput->setValue(V);
if (myLib.isLoaded())
QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第2处");
}
通过动态库,就可以把自己自定义的控件进行了打包。
创建静态库
有了之前的动态库,如果我们需要生成一个静态库。我们只需要在.pro文件中增加CONFIG+= staticlib
其他的步骤跟动态库的生成是一样的,没有什么的差别。
在构建的目录中会生成一个比较一点的.lib文件
把头文件和.lib的静态库文件增加到使用的项目当中就可以使用了,编译好新的项目的文件是不依赖库文件的,在编译的时候已经加载了静态库,这个就是动态库和静态库的区别。
.pro文件中增加CONFIG+= staticlib
其他的步骤跟动态库的生成是一样的,没有什么的差别。
在构建的目录中会生成一个比较一点的.lib文件
把头文件和.lib的静态库文件增加到使用的项目当中就可以使用了,编译好新的项目的文件是不依赖库文件的,在编译的时候已经加载了静态库,这个就是动态库和静态库的区别。