qq_41747698 2021-10-13 18:06 采纳率: 75%
浏览 63
已结题

制作dll,如何隐藏头文件私有变量,公有成员函数

想做一个有关opencv的dll,但是头文件存在Net类型,Mat类型导致发布dll时需要引用opencv.hpp,还有不需要暴露的成员函数,私有成员变量。
如下,能否举例说明 需隐藏Net net,void canny_crop函数应该如何实现

#pragma once

#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/opencv_world453.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/ippicvmt.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/libprotobuf.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/ippiw.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/libjpeg-turbo.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/ittnotify.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/ade.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/zlib.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/libopenjp2.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/libpng.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/quirc.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/IlmImf.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/libtiff.lib" )
#pragma comment( lib,"D:/opencv32/install/x86/vc14/staticlib/libwebp.lib" )

#include "stdafx.h"
#define _DLL_EXPORTS
#include <stdlib.h>  
#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/all_layers.hpp>

#include <string>
#include <vector>
#include <algorithm>
#include <array>
#include<cmath>
#include<windows.h>

#include <string>
using std::string;

using namespace std;
using namespace cv;
using namespace dnn;

class _declspec(dllexport) ocr
    //class ocr
{
private:
    //string _model_path;
    int crop_mode = 1;
    int thresh_mode = 1;
    int bitwise_mode2 = 0;
    double blur1 = 3;
    double blur2 = 11;

    int morph_xx, morph_yy;
    int morph_x = 1;
    int morph_y = 1;
    int morph_x2 = 1;
    int morph_y2 = 5;
    int iteration = 1;
    int canny_max = 300;
    int min_width = 8;
    string model_path;
    dnn::Net net;
    int rect_thresh = 0;
    int blocksize = 31;
    int C = 10;
    int a = 3;
    int c = 5;
    int b = -5;
    int d = 10;
    int softmax_thresh = 0.9;
    int _h = 1;
    int _w = 1;
    int _channel = 16;
    int RGB_mode = 0;//0为默认bgr
                     //unsigned char * img
    int showimg = 1;

public:
    ~ocr() {
    delete this->net0;
    }
    */
    ocr(void);
    ~ocr(void);

    void canny_crop(Mat &frame, Mat &output, vector<int>&result, vector<double>&softmax, int &flag2, vector<Rect> &digit_rect, int bitwise_mode2, int morph_x = 1, int morph_y = 9, //9
        int iteration = 1, int padding = 0, int canny_max = 300);

    //void crec(unsigned char *input, double &cdigits, double &minpercent, unsigned char *coutput, unsigned char *crect, unsigned char * ccanny, unsigned char * cthreshimg);//unsigned char图像,参数同上
    void ocr::crec(unsigned char *cinput, int h, int w, double &cdigits, double &minpercent, unsigned char *coutput, int &h1, int &w1);
    //传出灰度图像,h1,w1为图像属性
    //, unsigned char *crect, int &h2, int &w2, unsigned char * ccanny, int &h3, int &w3, unsigned char * cthreshimg, int &h4, int &w4);//unsigned char图像,参数同上
};

  • 写回答

1条回答 默认 最新

  • churuxu 2021-10-13 19:32
    关注

    一个导出函数头文件, 对外提供, 只写C函数,使用基础数据类型,导出函数用 extern "C" __declspec(dllexport) 修饰
    一个类头文件, 不对外提供,不要导出类
    一个实现文件,不对外提供,实现类的函数 + 导出函数

    导出函数头文件大概声明
    typedef struct mat{
    //这个需要哪些数据根据你自己的业务自己设计
    int rows;
    int cols;
    int data[16];
    }mat;

    Mat& 类型参数改为 mat*
    vector类型参数改为int[]
    引用类型改为指针

    导出C函数,而不是导出C++类,并且只使用基础类型数据,是为了提高DLL的通用性
    别的编译器(mingw)、别的编程语言,也能通过 LoadLibrary、GetProcAddress 动态加载调用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月20日
  • 已采纳回答 10月14日
  • 赞助了问题酬金 10月13日
  • 创建了问题 10月13日

悬赏问题

  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿