静态链接库(.lib+.dll)
声明:** 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。首先,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:
void HelloWorld(); //函数内部调用Win32 API,功能是弹出一个helloworld提示框
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 类供显示调用。下面给出一个完整的例子:
1 |
|
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 参数指定导入库文件名(不要加扩展名) (注:这是小写的L,不是hijk的大写i)
另外,导入库文件的路径中,反斜杠用的是向右倾斜的
3、在程序中include头文件(我试验用的dll是用C写的,因此要用 extern “C” { #include “dll.h” } )
下面是隐式调用的实例代码:
1 |
|
动态链接库(.a+.dll)
只需要修改 .pro 文件即可
首先是链接libcurl.dll,格式如下:
LIBS +=-L E:/1/web/bin -llibcurl
这里要注意的是语句最后要先加上 -l 如何再加上动态链接库的名字,不要带后缀。
接着是链接libcurldll.a,格式如下:
LIBS +=E:/1/web/lib/libcurldll.a
代码里面依旧需要 include 对应库的头文件
问题
imcompact:32位和64位不兼容(至少是不兼容),用对应的QT重新编译库的源代码一遍
can find:找不到,名字错了
运行直接崩溃:用同一套 .a 和 .dll