Qt调用qt生成的dll 显式和隐式(静态动态)

昨天突然想到 :接触了这么久的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





  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值