动态链接库的建立(opencv haar应用方面建立dll遇到的问题)

一、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动态链接库时候依次遇到的问题。


你可能感兴趣的:(动态链接库的建立(opencv haar应用方面建立dll遇到的问题))