利用VS编写并调用动态链接库

来源:互联网 发布:淘宝电商培训 编辑:程序博客网 时间:2024/06/05 23:00

写一下基于opencv库的C++代码怎么建立dll动态库,并将动态库进行调用。

一:建立生成动态链接库的工程 builddlllibrary。

1:打开vs

2:新建工程



3:选择确定


4:下一步,具体对话框的选择如下图所示。


我的头文件有两个

第一个是包含各种库的头文件"headfiles.h“

#ifndef _HEADFILES_H_#define _HEADFILES_H_#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp> #include <opencv2/objdetect/objdetect.hpp>#include <opencv2/ml/ml.hpp>#include <iostream> #include <ctype.h>  #include <vector>#include <fstream>#include <cv.h>  #include <cvaux.h> #include<io.h>#include"math.h"using namespace cv;using namespace std; #endif

第二个是自己的头文件"builddlllibrary.h"

#pragma once #include"headfiles.h"#ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif namespace zdd{//导出类 class DLL_API SimpleDll{public:SimpleDll();~SimpleDll();int add(int x, int y); //简单方法 void ImageEqualizeHist(Mat &src_img, Mat &res_img);};}
cpp文件有一个“builddlllibrary.cpp”

#define DLL_IMPLEMENT #include "builddlllibrary.h"namespace zdd{SimpleDll::SimpleDll(){}SimpleDll::~SimpleDll(){}int SimpleDll::add(int x, int y){return x + y;}void SimpleDll::ImageEqualizeHist(Mat &src_img, Mat &res_img){int i;//IplImage* src = cvLoadImage("0078.bmp", 1);IplImage* src = &IplImage(src_img);IplImage* imgChannel[4] = { 0, 0, 0, 0 };IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);if (src){for (i = 0; i < src->nChannels; i++){imgChannel[i] = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);  //要求单通道图像才能直方图均衡化}//通道分离cvSplit(src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3]);//BGRAfor (i = 0; i < dst->nChannels; i++){//直方图均衡化,原始图像和目标图像必须是单通道cvEqualizeHist(imgChannel[i], imgChannel[i]);}//通道组合cvMerge(imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst);res_img = (dst);}}}

对上面工程载dubug模式(此方法同样适用于release模式)下进行编译, 在debug文件下生成了 builddlllibrary.dll  和builddlllibrary.lib 两个文件。

下面建立一个工程testdlllibrary对动态库进行调用。 工程的建立与普通的工程建立一样。

建立完成后,builddlllibrary.dll ,builddlllibrary.lib ,builddlllibrary.h 和headfiles.h 四个文件放到工程目录下,将 builddlllibrary.h 和headfiles.h加载到工程中,主函数如下:

#include "builddlllibrary.h"#include <iostream>#pragma comment(lib,"builddlllibrary.lib")using namespace zdd; using namespace std;int main(char argc, char**argv){ SimpleDll sd;cout << "sd.add: 3+5=" << sd.add(3, 5) << endl;cv::Mat srcimg = imread("0044.bmp");Mat resimg;sd.ImageEqualizeHist(srcimg, resimg);imshow("src", srcimg);imshow("res", resimg);waitKey(0);return 0;}




0 0