Qt调用qt生成的dll 显式和隐式(静态动态)
来源:互联网 发布:网络模块接a还是b 编辑:程序博客网 时间:2024/06/05 21:49
昨天突然想到 :接触了这么久的qt了 dll(动态链接库)还没有用过就打算事件一下 差了半天资料 感觉网上没有一片文章讲述的全面详细,于是就有个这篇博客。
环境:win7+qt5.3.2
开始:
一、qt生成dll
1.建立生成dll的工程,选择C++库
然后就是写动态库的函数。
2.在这里我要做个详细的解释:
如果你要隐式的调用dll的话,就直接把函数写成q的类成员函数,如果要是显式调用的话 一定要声明称C的方式(接下来会详细谈到,因为我在调用的时候就遇到了这样的问题)。
3.先介绍隐式调用
// =======sld.h=====================
#ifndef SLD_H
#define SLD_H
#include "sld_global.h"
class SLDSHARED_EXPORT Sld
{
public:
Sld();
QString GetStr();
};
#endif // SLD_H
//===============sld.cpp================
#include "sld.h"
#include <QString>
Sld::Sld()
{
}
QString Sld::GetStr()
{
return "hello world";
}
这就是dll的工程,动态库只有一个函数,返回“hello world”;编译之后 就会在debug文件里有一个sld.dll文件 这个就是生成的动态库 .a文件也在里面。
新建一个工程来调用dll (在界面上添加一个button用来调用动态库的函数)
//===================.pro=====================
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = testDll
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
LIBS +=-L D:/QtProjects/testDll/dll/ -lsld #动态库头文件以及动态库的位置// ===================.h=======================
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
//==================.cpp=============
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "./dll/sld.h"
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
Sld sld;
qDebug()<<GetStr();
}
Notice: 最关键的一点:一定要把生成的dl复制一个l放在跟exe同文件夹下,要不然会直接运行报错。
// 结果
这个就是隐式调用。
二、显式调用
1.动态库的创建跟上面的差不多,唯独不一样的地方是在函数声明的时候要用extern “C”声明
//+===============sld.h================
#ifndef SLD_H
#define SLD_H
#include "sld_global.h"
class SLDSHARED_EXPORT Sld
{
public:
Sld();
};
extern "C" SLDSHARED_EXPORT QString GetStr();
//=============sld.cpp=====================
#define DLL __declspec(dllexport)#include "sld.h"#include <QString>Sld::Sld()
{}QString GetStr(){return "hello world";}
1.新建一个工程。
//===========pro==============
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = testDll
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
LIBS +=-L D:/QtProjects/testDll/dll/ -lsld #动态库头文件以及动态库的位置
在main函数里写上
//=========main.cpp=================
#include "mainwindow.h"
#include <QApplication>
#include "./dll/sld.h"
#include <QLibrary>
#include <QDebug>
typedef QString (*funtest)();// 函数指针
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
// w.show();
QLibrary mylib("sld.dll");
if(mylib.load())
qDebug()<<"load ok!";
funtest hello = (funtest)mylib.resolve("GetStr");
if(hello)
{
qDebug()<<"load hello ok!";
qDebug()<<hello();
}
else
{
qDebug()<<"load GetStr failed!";
}
return a.exec();
}
结果:
有什么不明白 或者内容有误的话 可以聊 Q:745121731
- Qt调用qt生成的dll 显式和隐式(静态动态)
- QT编写和调用dll动态库最新版(隐式调用)
- QT编写和调用dll动态库最新版(隐式调用)
- Qt显式调用动态文件(dll)
- Qt中调用VC6生成的动态库DLL文件
- QT显式调用DLL的例子
- C++对dll链接库的显示(动态)调用和隐式(静态)调用
- QT生成DLL,调用DLL
- QT生成DLL,调用DLL
- QT生成DLL,调用DLL
- QT动态链接库(DLL)的创建和调用
- Linux+qt生成和调用静态库
- windows 下Qt调用Qt生成的dll
- Qt隐式/显式调用DLL
- Qt显式调用C++写的dll + 外一篇
- Qt显式调用C++写的dll + 外一篇
- Qt显式调用C++写的dll + 外一篇
- Qt显式调用C++写的dll + 外一篇
- Co-op 重塑了四叶草标志
- 浏览器乱码问题
- C# WINFORM 强制让窗体获得焦点(可实现单次置顶或持续置顶)
- kvm 安ERROR Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory
- keil5不能识别自己写的头文件
- Qt调用qt生成的dll 显式和隐式(静态动态)
- CCNET+MSBuild+SVN实时构建的优化总结
- 算法基础 - 最小生成树(Kruscal算法)
- Android设计模式--适配器模式--Adapter入门
- 博客地址迁移啦!!!
- 雷达目标散射截面积(RCS)
- 一个优化过的OC的简单冒泡排序算法
- C语言宏定义
- shell运算符:算数运算符, 关系运算符,布尔运算符,字符串运算符,文件测试运算符