• Qt如何调用VS编写的动态链接库(dll文件)


    在最近的开发中需要做了demo,来验证公司的老项目能否在Qt上做重新开发;于是碰到的第一个问题那就是dll文件如何加载了;网上查阅了很多资料,记录一下已成功加载dll文件的方法,以防遗忘。

    下面是我在VS编译器上写的一个简单的dll文件,关于dll文件如何编写,我就不再赘述了。

    .h文件

    #ifndef  _MYDLL_H
    #define _MYDLL_H
    
    #ifdef MYDLL_EXPORTS
    #define  MYDLL_API __declspec(dllexport)
    #else
    #define  MYDLL_API __declspec(dllimport)
    #endif 
    
    extern "C" MYDLL_API int add(int a, int b);
    
    #endif

    .cpp文件

    #include "mydll.h"
    
    extern "C" MYDLL_API int add(int a, int b)
    {
        return (a + b);
    }

    编译成功后,会得到下面三个文件,mydll.h、MyDll.lib、MyDll.dll

    然后打开Qt创建一个项目;我是把这三个文件全部拷贝到了运行工作目录;如下所示:

    下面介绍一下Qt如何隐式调用dll文件:

    打开.Pro文件

    在工程文件中包含.h文件的路径以及库文件的路径即可,下面就是如何调用库文件中的函数了:

    #include <QDebug>
    #include <QLibrary>
    #include "mydll.h"  //包含头文件
    
    
    int main()
    {
        qDebug() << add(10, 20);
        return 0;
    }

    上述是隐式调用库文件的函数,还有一种显示调用方法,如下所示:

    #include <QDebug>
    #include <QLibrary>
    #include "mydll.h"  //包含头文件
    
    typedef int(*pFun)(int, int);
    
    int main()
    {
        QLibrary mydll("MyDll.dll");
        if(!mydll.load())
        {
            qDebug() << "load dll error";
        }
        else
        {
            qDebug() << "load dll success";
            pFun myAdd = (pFun)mydll.resolve("add");
            if(myAdd){
                qDebug() << myAdd(1, 10);
            }
            else
            {
              qDebug() << "get Function address error";
            }
    
        }
        if(mydll.isLoaded())
        {
            mydll.unload();
        }
    
        return 0;
    }

    相较而言,隐式调用比显示调用更加简洁,通常都是选择隐式调用更为合适。

    当然,在配置库文件的路径时,也可以选择用相对路径的方式,如下所示:

  • 相关阅读:
    FTP-实例(Md5验证)
    Socket-实例
    函数对象、函数嵌套、名称空间与作用域、装饰器
    Docker——手动创建镜像
    Docker——桥接网络配置
    Docker——网络和存储(数据卷)
    Docker-PS命令解析
    面试题44:扑克牌的顺子
    面试题42:翻转单词顺序VS左旋转字符串
    面试题41:和为s的两个数字VS和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/QingYiShouJiuRen/p/11428662.html
Copyright © 2020-2023  润新知