VS2008动态调用QT4.8.5生成的动态库
1、首先使用VS2008新建一个Win32控制台应用程序,附加选项选择空项目。
2、然后新建一个.cpp文件,在这个.cpp文件中编写调用动态链接库的代码。然后直接运行,这是应该是有错误的,没有关系,这一步主要是生成.exe的文件夹。
3、将你要调用的动态库.dll文件以及它的依赖项都拷贝到.exe同级目录下,一定要把它的依赖项也拷贝过去,否则动态库是调用不到的。
4、代码调用
`
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <tchar.h>
using namespace std;
//定义一个指向空的函数指针
typedef void (* DLLDEMOFUNC)(void);
int main(void)
{
DLLDEMOFUNC dllFunc = NULL;
HINSTANCE hDll;
//动态加载dll
hDll = ::LoadLibrary(_T("LaneFareCalc1.dll"));
DWORD error_id=GetLastError(); //用于查看错误代码,若无错误,则为0
if (hDll) //如果指针已经获取到dll的地址
{
cout<<"句柄内dll可用"<<endl;
typedef int (WINAPI *Fun_FC_Init_P)(const char *, int);
Fun_FC_Init_P FC_Init_P = NULL; //定义一个指向动态库中函数的指针
FC_Init_P = (Fun_FC_Init_P)GetProcAddress(hDll, "FC_Init"); //获取dll动态库中FC_Init函数的地址
if (NULL==FC_Init_P)
{
cout<<"动态库中函数加载失败!"<<endl;
}
//初始化,这是我动态库里面封装的函数
int nelt0;
nelt0=FC_Init_P("192.168.2.23",1000);
cout<<"初始化结果:"<<nelt0<<endl;
}
//卸载dll
FreeLibrary(hDll);
return 0;
}
`
5、以上就是调用动态库的流程了,下面来总结一下遇到的问题
(1)我在刚开始调用的时候获取到错误代码126,上网搜了一下,好多说动态库放置的位置不对,导致程序找不到,但是我换了好多位置,相对路径绝对路径什么的都试过了,依旧是这个问题。后来看到有的地方说,vs不能直接调用QT用mingw编译器生成的动态库,应该使用msvc编译器,导致我又把我的mingw版本的卸载掉了,安装了msvc版本的QT,但是,仍然不可以。后来,经过我苦苦探索,历尽千辛,终于找到了问题的所在,因为我生成的动态库本身就有依赖的文件,所以单单是把它拷贝过去是不可以的,要把它的依赖项全部拷贝过去。那如何知道它有哪些依赖项呢,可以使用vs2008的命令提示进行查看。
在程序中搜索visual studio 2008 命令提示,然后打开
打开之后进入到dll所在的目录中,我的程序在D:\driver\LaneFareCalc\build-LaneFareCalc-123-Debug\debug中,所以如图
按回车,就进入到目录了
接着键入dumpbin /dependents +动态库的名字,按下回车,就可以查看了
将其中所有的dll文件都拷贝到.exe同级目录中就可以了。
(2)还遇到了错误代码193,这个错误是因为拷贝的dll文件中有的不是生成动态库时使用的,拷贝的文件一定要是生成动态库时用的,不能随便找一个同名的拷过去!!!
(3)还有一个令我崩溃的问题,就是无法定位程序输入点xxxxxx于xxx.dll上,这个问题主要是依赖项dll适用的系统不对,如何查看dll所适用的系统呢,可以使用电脑自带的cmd。首先打开cmd,进入到你所要查看的dll的目录中,使用dumpbin /headers xxx.dll命令进行查看,其中machine中的内容即为适用系统。