ncnn模型部署——使用VS2019把项目打包成DLL文件

news2025/1/10 20:57:58

一、项目打包成DLL文件

1.创建动态链接库DLL项目

创建完成,项目中包含源文件dllmain.cpp, pch.cpp,头文件framework.h, pch.h

2.编写和配置DLL项目

(1)配置pch.h文件,在头文件pch.h中定义宏,宏的作用的是允许该函数能够被外部访问,并直接调用

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#endif //PCH_H

#ifdef IMPORT_DLL
#else
#define IMPORT_DLL extern "C" _declspec(dllimport)//指定允许给其他外部调用
#endif

#include <vector>
#include <string>
using namespace std;
IMPORT_DLL int FaceFeatureExtarctor(const string image_path, vector<float>& feature);

这里添加FaceFeatureExtarctor()这个可供外部调用函数的宏定义,并在pch.cpp中添加具体实现函数:

// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"
#include "face.h"

// 当使用预编译的头时,需要使用此源文件,编译才能成功。


int FaceFeatureExtarctor(const string image_path, vector<float>& feature)
{
	int ret = feature_extarctor(image_path, feature);
	return ret;
}

(2)添加其他函数源文件与头文件

这里我添加了mtcnn, arcface 等进行人脸检测与特征提取,添加对应的.cpp源文件和.h头文件。完整的项目如下:

3.编译生成DLL文件

点击:“生成 -> 生成解决方案” 来进行编译,但出现错误:

在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h””?

解决方法:

点击:“项目 -> 属性”,在 “C/C++ -> 预编译头” 中把预编译头设置为“不使用预编译头”

然后重新编译,编译成功,并且生成了DLL文件

二、在别的工程调用DLL文件

新建一个别的项目,进行直接调用DLL接口得到识别的结果

1.新建项目

创建一个空项目,然后创建一个main.cpp 源文件

2.加载和调用DLL文件

把之前项目生成的DLL文件复制本项目中,同时自己的模型文件也要复制到本项目中,我这里直接复制到main.cpp同级目录下,然后在main.cpp中调用DLL的接口

main.cpp 内容如下

#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;

typedef int (*function_face)(const string image_path, vector<float>& feature);

int main()
{
	HINSTANCE hDllInst;
	hDllInst = LoadLibrary(L"face_feature_extractor_Dll.dll");
	if (hDllInst) {
		cout << "LoadLibrary success!" << std::endl;

		function_face FaceFeatureExtarctor = (function_face)GetProcAddress(hDllInst, "FaceFeatureExtarctor");

		const string image_path = "./images/test.png";
		
		vector<float> face_features;
		int ret = FaceFeatureExtarctor(image_path, face_features);
		if (ret == 0) {
			cout << "Get face feature success!" << std::endl;
			cout << "feature size: " << face_features.size() << std::endl;
			for (int i = 0; i < face_features.size(); i++) {
				cout << face_features[i] << std::endl;
			}
		}

		return 0;
	}
	else {
		cout << "LoadLibrary fail!" << std::endl;
		return -1;
	}
}

然后按F5快捷键进行调试,没有问题,成功输出模型推理的结果。


参考:

1. https://blog.csdn.net/weixin_43017004/article/details/123434292

2.  https://blog.csdn.net/Sagacity_1125/article/details/126718150

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1292419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE3给table的head添加popover筛选、时间去除时分秒、字符串替换某字符

1. VUE3给table的head添加popover筛选 <el-tableref"processTableRef"class"process-table"row-key"secuId":data"pagingData"style"width: 100%"highlight-current-row:height"stockListHeight":default-exp…

晶圆测试工艺介绍

第一章、晶圆测试简介 晶圆测试的方式&#xff0c;主要是通过测试机&#xff08;事先编好程序&#xff09;和探针台的联动&#xff0c;依靠探针卡的接触衔接&#xff0c;进行晶圆级的芯片测试。 当探针卡Probecard 的探针正确接触晶圆wafer 内一颗 芯片die的每个接触点bondpads…

毕设:《基于hive的音乐数据分析系统的设计与实现》

文章目录 环境启动一、爬取数据1.1、歌单信息1.2、每首歌前20条评论1.3、排行榜 二、搭建环境1.1、搭建JAVA1.2、配置hadoop1.3、配置Hadoop环境&#xff1a;YARN1.4、MYSQL1.5、HIVE(数据仓库)1.6、Sqoop&#xff08;关系数据库数据迁移&#xff09; 三、hadoop配置内存四、导…

网络层(1)——概述

一、概述 网络层毫无疑问是最复杂的一层&#xff0c;涉及到大量的协议与结构的内容。在如今主流的设计中&#xff0c;大家都会把网络层分成两个部分&#xff1a;数据平面、控制平面。其中数据平面指的是网络层中每台路由器的功能&#xff0c;它决定了到达路由器端口输入链路之一…

软考2018下午第六题改编逻辑(状态模式)

在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…

为什么 AWS 数据库不讲 HTAP

在 AWS re:Invent 2023 掌门人 Adam Selipsky 的 Keynote 上&#xff0c;数据库方面最重磅的主题是 Zero-ETL&#xff0c;从 TP 数据库 (RDS, Aurora, DynamoDB) 同步数据到 AP 数据库 (Redshift)。 Zero-ETL 是 AWS 在去年 re:invent 2022 上推出的概念&#xff0c;今年则继…

Peter算法小课堂—贪心算法

课前思考&#xff1a;贪心是什么&#xff1f;贪心如何“贪”&#xff1f; 课前小视频&#xff1a;什么是贪心算法 - 知乎 (zhihu.com) 贪心 贪心是一种寻找最优解问题的常用方法。 贪心一般将求解过程分拆成若干个步骤&#xff0c;自顶向下&#xff0c;解决问题 太戈编程第…

simulink enable模块——使能子系统案例仿真分析

1.案例分析 仍以一个简单的乘法增益案例分析 分析&#xff1a;可以看到&#xff0c;在满足条件性才条用使能子系统&#xff0c;在t1s和3s时刻&#xff0c;进行增益操作&#xff0c;这和上篇博客中的触发trigger子系统相同的作用。 simulink trigger模块使用——多种调用案例分…

膜结构建筑:未来体育可持续发展的绿色引擎

随着城市化的飞速发展&#xff0c;现代建筑迫切需要创新性的解决方案&#xff0c;而膜结构建筑以其独特的设计理念和可持续性特点&#xff0c;正在成为未来城市发展的重要引擎。本文将深入探讨膜结构建筑在可持续城市发展中的关键作用&#xff0c;包括其在节能减排、资源有效利…

【Qt开发流程】之元对象系统

描述 Qt的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的核心机制之一&#xff0c;它提供了运行时类型信息&#xff08;RTTI&#xff09;和信号与槽&#xff08;Signals and Slots&#xff09;机制的支持。元对象系统在Qt中扮演了很重要的角色&#xff0c;它…

C++STL的string类(一)

文章目录 前言C语言的字符串 stringstring类的常用接口string类的常见构造string (const string& str);string (const string& str, size_t pos, size_t len npos); capacitysize和lengthreserveresizeresize可以删除数据 modify尾插插入字符插入字符串 inserterasere…

解决WPS拖动整行的操作

如上图&#xff0c;想要把第4行的整行内容&#xff0c;平移到第1行。 1.选中第4行的整行 2.鼠标出现如图的样子时&#xff0c;按住鼠标左键&#xff0c;上移到第1行位置后&#xff0c;放开左键即可。

PPT设置章节

0 Preface/Foreward 1 添加章节方法 选择 > 开始 > 节 可以进行&#xff1a; 新增节重命名节删除所有节 相关节的内容如下&#xff1a;

vivado时序方法检查5

TIMING-14 &#xff1a; 时钟树上的 LUT 在时钟树上发现 LUT <cell_name> 。不建议在时钟路径上包含 LUT 单元。 描述 时钟路径上的 LUT 可能导致偏差过大 &#xff0c; 因为时钟必须在穿过互连结构的常规布线资源上进行布线。除偏差过大外 &#xff0c; 这些路径更…

【Java系列】函数式接口编程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【算法每日一练]-结构优化(保姆级教程 篇4 树状数组,线段树,分块模板篇)

除了基础的前缀和&#xff0c;后面还有树状数组&#xff0c;线段树&#xff0c;分块的结构优化。 目录 分块 分块算法步骤&#xff1a; 树状数组 树状数组步骤&#xff1a; 线段树点更新 点更新步骤&#xff1a; 线段树区间更新 区间更新步骤&#xff1a; 分块 分块算…

Linux CentOS本地部署SQL Server数据库结合cpolar内网穿透实现公网访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装sql server二. 局域网测试连接三. 安装cpolar内网穿透四. 将sqlserver映射…

集合进阶指南:从基础知识到高级应用

集合高级 Collection集合 数组和集合的区别 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的数组可以存储基本数据类型和引用数据类型 集合只能存储引用数据类型,如果要存基本数据类型,需要存对应的包装类 集合类体系结构 Collectio…

一天一个设计模式---原型模式

基本概念 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是通过复制现有对象来创建新对象&#xff0c;而不是通过实例化类。原型模式允许在运行时动态创建对象&#xff0c;同时避免了耦合与子类化。 在原型模式中&#xff0…

Tap虚拟网卡

1 概述 Tap设备通常用于虚拟化场景下&#xff0c;其驱动代码位于drivers/net/tun.c&#xff0c;tap与tun复用大部分代码&#xff0c; 注&#xff1a;drivers/net/tap.c并不是tap设备的代码&#xff0c;而是macvtap和ipvtap&#xff1b; 下文中&#xff0c;我们统一称tap&#…