声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:

[cpp] view plain copy

  1. void HelloWorld();     //函数内部调用Win32 API,功能是弹出一个helloworld提示框
  2. int add(int a,int b);  //实现两个数相加,并返回结果

下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数,follow me....

预备知识:

1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。

2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()

其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)

GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用

FreeLibrary() 释放dll所占空间

1、显示调用

Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:

[cpp] view plain copy

  1. #include <QApplication>
  2. #include <QLibrary>
  3. #include <QDebug>
  4. #include <QMessageBox>
  5. #include "dll.h"             //引入头文件
  6. typedef int (*Fun)(int,int); //定义函数指针,以备调用
  7. int main(int argc,char **argv)
  8. {
  9. QApplication app(argc,argv);
  10. QLibrary mylib("myDLL.dll");   //声明所用到的dll文件
  11. int result;
  12. if (mylib.load())              //判断是否正确加载
  13. {
  14. QMessageBox::information(NULL,"OK","DLL load is OK!");
  15. Fun open=(Fun)mylib.resolve("add");    //援引 add() 函数
  16. if (open)                  //是否成功连接上 add() 函数
  17. {
  18. QMessageBox::information(NULL,"OK","Link to Function is OK!");
  19. result=open(5,6);      //这里函数指针调用dll中的 add() 函数
  20. qDebug()<<result;
  21. }
  22. else
  23. QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");
  24. }
  25. else
  26. QMessageBox::information(NULL,"NO","DLL is not loaded!");
  27. return 0;  //加载失败则退出28}

myDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。显然,显示调用代码书写量巨大,实在不方便。

2、隐式调用

这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:

1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,

2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL

-L 参数指定 .lib/.a 文件的位置

-l  参数指定导入库文件名(不要加扩展名)

另外,导入库文件的路径中,反斜杠用的是向右倾斜的

补充:

unix:LIBS += -L your_lib_path -lyour_lib(-l后面是库的名字去掉lib和后缀
比如libprotobuf.so,则为-lprotobuf)
win32:LIBS += your_lib_path/your_lib(mingw和msvc可能不一样)

3、在程序中include头文件(我试验用的dll是用C写的,因此要用 extern "C" { #include "dll.h" } )

下面是隐式调用的实例代码:

[cpp] view plain copy

  1. #include <QApplication>
  2. #include <QDebug>
  3. extern "C"    //由于是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意
  4. {
  5. #include "dll.h"
  6. }
  7. int main(int argv ,char **argv)
  8. {
  9. QApplication app(argv,argv);
  10. HelloWordl();          //调用Win32 API 弹出helloworld对话框
  11. qDebug()<<add(5,6);    // dll 中我自己写的一个加法函数
  12. return 0;  //完成使命后,直接退出,不让它进入事件循环
  13. }

还是隐式调用方便啊,直接就可以调用dll中的函数...

补充:编译的时候没报错,说明 pro文件的参数没问题,可能是运行的时候找不到so,运行时大概的库搜索路径顺序
  1)当前目录
   2) LD_LIBRARY_PATH参数设定目录
  3)  /etc/ld.so 下配置文件设定,修改后需root用户调用下ldconfig刷新下
  4)/lib ,/usr/lib目录
建议在qtcreator 里,project 里环境变量LD_LIBRARY_PATH增加 path_to_lib,或者直接把so文件拷贝到当前调用主程序当前目录

http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.htm

用qt调用第三方库resolve相关推荐

  1. Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework

    Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework 该文章是一篇说明c++/Qt调用 ...

  2. 【QMT】给QMT量化交易软件安装和调用第三方库(举例通达信pytdx,MyTT,含代码)

    给QMT量化交易软件安装和调用第三方库(举例通达信pytdx,MyTT,含代码) 一.安装QMT 二.给QMT安装python 三.给QMT的python环境安装第三方库 1.准备python虚拟环境 ...

  3. Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  4. linux下Qt调用C++库文件(.so)程序实现

    文章目录 主要内容 一.编程环境及实现方法 二.项目实现 1.创建项目 2.导入库文件 三.项目中遇到的问题 总结 主要内容 如标题所示,在linux下使用qtcreator创建项目调用C++库文件, ...

  5. linux python qt 安装目录,Linux 下QT调用Python库文件 以及Linux 安装Python3.8开发环境 问题...

    最近想运用linux系统下Qt来实现c++ 与python的混合编程,linux系统会自带python2.7版本或者python3.5版本(深度linux). Qt调用python文件需要在pro文件 ...

  6. python如何封装成可调用的库_在python中如何以异步的方式调用第三方库提供的同步API...

    在关于asyncio的基本用法中提到,asyncio并不是多线程.在协程中调用同步(阻塞函数),都占用同一线程的CPU时间,即当前线程会被阻塞(即协程只会在等待一个协程时可能出让CPU,如果是普通函数 ...

  7. linux qt libs,linux下qt使用第三方库的那些事

    开发库查看工具:$sudo apt-get install pkg-config 很多时候我们并不知道自己电脑有没有这个库,所以我们可以使用这个工具来查看自己有哪些工具,或者哪些工具没有.同时,qma ...

  8. qt linux 添加库文件路径,linux下qt使用第三方库的那些事

    开发库查看工具:$sudo apt-get install pkg-config 很多时候我们并不知道自己电脑有没有这个库,所以我们可以使用这个工具来查看自己有哪些工具,或者哪些工具没有.同时,qma ...

  9. c#与python 交互(调用第三方库)

    我是文明,文章来源于项目实践,以下即代表我的个人认同与看法,有不同看法的可以留言哈,谢谢你的阅读,文章有错字或代码错误请指正,谢谢你哦. 由于项目项目需求,必须使用python的方式研发项目,使用c# ...

  10. 【厚积薄发系列】C++项目总结18—调用第三方库接口编译无错误但得不到预期结果

    问题背景: 前段时间项目中要用到一个压缩文件的功能,像这种工具类的功能第一反应就是在网上找第三方库,顺利找到第三方库后.按照常规套路,设置附加包文件目录.附加库目录.附加依赖性.配置好顺利编译成功,程 ...

最新文章

  1. php fpm listen.owner,php-fpm配置解释
  2. DCMTK:DcmOtherLong类的测试程序
  3. (46)Verilog HDL 自动饮料机设计
  4. 【flink】Flink 1.12.2 源码浅析 : Task 浅析
  5. 阿姆达尔定律(Amdahl's law)
  6. java中带包的类在命令行中的编译和执行中出现的问题及解决办法
  7. Nuxt3 服务端渲染 、elementplus多皮肤黑暗模式
  8. 使用c语言的多学科协同仿真软件,一种多学科协同仿真系统及方法与流程
  9. 明白熊猫与冰墩墩的区别,就知道青云KubeSphere与QKCP该如何选择
  10. Linux如何切换字符或者图形界面
  11. web前端开发面试题(三)
  12. AUC与ROC曲线面积的意义(细扒sklearn的AUC计算方法)
  13. Matlab按照二进制读写txt文件
  14. 绿色版plsql安装和安装包
  15. 想做好物流成本控制,得秉承这个思路
  16. C/C++大学生考勤系统
  17. 案例篇-HBase 在滴滴出行的应用场景和最佳实践
  18. pandownload + speedpan下载器 tampermonkey + IDM下载器
  19. 用osworkflow写一个请假例子
  20. 深度学习框架(如:Pytorch、Tensorflow、Caffe...)

热门文章

  1. 彼得.泰尔:认知未来是投资人的谋生之道
  2. (转)神秘的比特币地址详解
  3. (转)国外Fintech创业者坦言:你不知道的Fintech三大困境
  4. (转)Matlab映射表数据结构(containers.Map)
  5. 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task
  6. Linux宝库快讯 | OpenInfra中国日正式确定会议合作方
  7. 【数字信号】基于matlab GUI数字电子琴【含Matlab源码 272期】
  8. js tree选中子集默认选中上级_原生js实现轮播图(两种方法)
  9. 深度学习后向算法的直观理解_强化学习的直观介绍
  10. Ubuntu设置截图的快捷键