qt调用动态库注意点

来源:互联网 发布:韩信点兵的算法 编辑:程序博客网 时间:2024/05/21 07:58

创建动态库的时候注意点:
1、 创建动态库后,想要建立一个新的类,那么一定要在类的头文件 class 前加入***(工程名)SHARED_EXPORT。

调用动态库注意点:
1、 确认动态库是否和本项目使用同一个编译器编译的,以及在build的时候注意,如果项目是build Debug模式下,那么调用的动态库也必须是build Debug编译的,必须对应。(如果项目需要调试,那么调用build Debug编译的动态库,等程序发布的时候,重新修改pro文件导入release版的动态库,在发布)。
2、 调用动态库有两种方法

尝试了在Qt调用VS动态库的2种方法:显式加载和隐式加载。Qt版本采用5.1,使用的默认编译器gcc;VS使用2010。详细过程如下:

(1)在VS2010中导出动态库,导出过程未使用windows平台相关的代码。

复制代码
 1 /*************************************** 2 * MyDll.h            3 ***************************************/ 4 #ifndef MYDLLEXPORT 5 #define MYDLLEXPORT extern "C" __declspec(dllimport) 6 #endif 7  8  9 MYDLLEXPORT int  add(int a, int b);10 MYDLLEXPORT int     g_nCount;
复制代码
复制代码
 1  /*************************************** 2  * DllDemo.cpp            3  ***************************************/ 4 #define MYDLLEXPORT extern "C" __declspec(dllexport) 5 #include "MyDll.h" 6  7 int  g_nCount = 0; 8  9 int add(int a, int b){10     return (g_nCount += a + b);11 }
复制代码

编译后生成2个文件:DllDemo.lib,DllDemo.dll。

(2)Qt中实现调用

  不同调用方式需要的文件不同,对于显式加载只需要*.dll;隐式加载需要*.h,*.dll。这里只贴出部分代码如下:

  • 显式

  显式调用需要将*.dll文件复制到生成目录的执行文件所在路径下(.exe所在),注意的是Qt Creator中生成目录是在源码目录外的。然后在代码中Load。

复制代码
 1 QLibrary lib("DllDemo"); // 不需要后缀 2 if (lib.load()) 3 { 4      typedef int(*AddFunction)(int a,int b); 5       AddFunction Add=(AddFunction)lib.resolve("add"); 6       if (Add) 7       { 8           int res = Add(20, 155); 9           ui->lineEdit->setText(QString("%1").arg(res));10       }11 }
复制代码
  • 隐式

  隐式加载时在*.pro手动添加:LIBS+=DllDemo.dll,然后倒入所需头文件,在调用处包含并调用其中的接口即可。

复制代码
1 /***************************************2  * LIBS += DllDemo.dll    3  ***************************************/4 #include "MyDll.h"5 // 隐式调用 6 int res = add(20, 155);7  ui->lineEdit->setText(QString("%1").arg(res));
复制代码

  以上过程中调用动态库只是简单的C函数,关于C++类或包含win32的导出库待后研究......

原创粉丝点击