一、dll的建立(vs2008)
1、新建win32工程
2、下一步,应用类型选dll;附加条件:空的工程。
3、分别建立xx.h,内容为:
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
//上面添加需要的头文件
#ifndef XX_H
#define XX_H
extern "C" int __declspec(dllexport) add(int x, int y);
#endif
建立xx.cpp 内容为:
#include "xx.h"
int add(int x, int y)
{
return x + y;
}
4、调试,debug即可生成。
二、dll的调用
#include <stdio.h>
#include <windows.h>
/*Dll的动态调用*/
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary("C:\\Users\\ma\\Desktop\\dllCall\\Debug\\adddll.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
/*
//Dll的静态调用//
#pragma comment(lib,"dllTest.lib")
//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" int __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{
int result = add(2,3);
printf("%d",result);
return 0;
} */
三、haar的dll引用中出现的各种问题
1.error LNK2019: unresolved external symbol _WinMain@16 referenced in function ....
问题:这是建工程的时候建立了windows工程,而不是控制台工程,导致程序找不到主函数入口。应该建立控制台应用程序,改正方法:项目属性-->Linker-->System-->Subsystem 选择Console就可以了。
2. error LNK2019: unresolved external symbol _cvLoadImage referenced in function _main facecall.obj
问题:修改properties--configuration properties--linker--input--additional dependencies加入kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib cxcore210.lib cv210.lib ml210.lib highgui210.lib cvaux210.lib faceDll.lib $(NOINHERIT)
这是没有加入依赖库文件 导致找不到各种dll所致。
3. error C2664: 'LoadLibraryW' : cannot convert parameter 1 from 'const char [11]' to 'LPCWSTR' e:\facecall\facecall\facecall\facecall.cpp 32
问题:hDll = LoadLibrary("E:\\car.dll");改为hDll = LoadLibrary(L"E:\\car.dll");
或者保持hDll = LoadLibrary("E:\\car.dll");不变,修改properties--configuration properties--general--character set --not set
4.error C2664: 'int (int,CvHaarClassifierCascade *)' : cannot convert parameter 1 from 'IplImage *' to 'int' e:\facecall\facecall\facecall\facecall.cpp 38
问题:最开始的typedef int(*lpAddFun)(int,CvHaarClassifierCascade *); //宏定义函数指针类型 出现了不统一 或者dll中的函数形参出现了不统一。
5.调试无错误 但是运行到cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );的时候会自动中断报错为:opencv error : Unspecified error (The node does not represent a user object (unknown type?)) in unknown
function ...
问题:缺少cvhaar.cpp文件,在cv/下面 cvhaar.cpp。可能由于调用cvHaarDetectObjects这个函数把这个cvhaar.cpp给链接进来了。就是找不到这个文件,才会出错。
加入这个文件后还要包含_cv.h 。 _cvimgproc.h _cvgeom.h这三个头文件。
以上就是我在建立haar动态链接库时候依次遇到的问题。