VS2019创建c++动态链接库dll与调用方法

VS2019创建c++动态链接库dll与调用方法

1.点击文件-》新建-》项目,输入dll,选择具有导出项的(DLL)动态链接库

2.输入一个文件名:dll2

头文件.h

3.添加加减法函数:

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL2_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLL2_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLL2_EXPORTS
#define DLL2_API __declspec(dllexport)
#else
#define DLL2_API __declspec(dllimport)
#endif// 此类是从 dll 导出的
class DLL2_API CDll2 {
public:CDll2(void);// TODO: 在此处添加方法。
};extern DLL2_API int nDll2;DLL2_API int fnDll2(void);
namespace Caculation
{//用于导出的各个功能class DLL2_API CacuFunc{public:CacuFunc(void);template<typename ADD>ADD add(ADD a,ADD b);template<typename SUB>SUB sub(SUB a, SUB b);};}

4.cpp文件里添加实现与重载方法

// Dll2.cpp : 定义 DLL 的导出函数。
//#include "pch.h"
#include "framework.h"
#include "Dll2.h"
#include <fstream>
#include <iostream>
using namespace std;
// 这是导出变量的一个示例
DLL2_API int nDll2=0;// 这是导出函数的一个示例。
DLL2_API int fnDll2(void)
{cout << "this is dll two" << endl;return 0;
}// 这是已导出类的构造函数。
CDll2::CDll2()
{return;
}
namespace Caculation 
{CacuFunc::CacuFunc(void){return;}template<typename ADD>ADD CacuFunc::add(ADD a, ADD b){return a + b;}template<typename SUB>SUB CacuFunc::sub(SUB a, SUB b){return a-b;}}
template DLL2_API int Caculation::CacuFunc::add(int a,int b);
template DLL2_API float Caculation::CacuFunc::add(float a, float b);
template DLL2_API double Caculation::CacuFunc::add(double a, double b);template DLL2_API int Caculation::CacuFunc::sub(int a, int b);
template DLL2_API float Caculation::CacuFunc::sub(float a, float b);
template DLL2_API double Caculation::CacuFunc::sub(double a, double b);

5. 配置编译成x64

6.编译解决方案:

 7.拷贝头文件:

8.粘贴到release文件夹

调用dll方法 

动态链接库的使用有两种方式,一种是显式调用。一种是隐式调用。

(1)       显式调用:使用LoadLibrary载入动态链接库、使用GetProcAddress获取某函数地址。

(2)       隐式调用:可以使用#pragma comment(lib, “XX.lib”)的方式,或者直接将XX.lib加入到工程中(打开项目->属性->链接器->输入)。(参考:c++调用动态库LNK2019无法解析的外部符号LNK1120无法解析的外部命令-CSDN博客)

9.新建控制台应用程序

10.复制Dll2.h,Dll2.dll,Dll2.lib三个文件,参考第8步,粘贴到控制台项目文件夹 

11.添加头文件并关联库 

12.添加dll2.h头文件到项目

 

 

调用方法:

选择x64

编译并测试运行:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爱普生SMD3225贴片晶振升级版TSX-3225

爱普生有一款外形尺寸3.2*2.5mm的无源贴片晶振&#xff0c;型号TSX-3225&#xff0c;也是非常直观的能从型号分辨其封装尺寸大小的&#xff0c;被广泛应用于便携式的无线传输设备&#xff0c;同时&#xff0c;这也是一款非常成熟的产品&#xff0c;毕竟SMD3225封装是目前市场主…

部署LVS-DR模式(附带详细实验)

目录 一.数据包流向分析 二.DR模式特点 三.ARP问题及解决办法 四.实验部署 1.配置负载调度器&#xff08;192.168.80.105&#xff09; 1.1.安装并启用ipvsadm 1.2.配置虚拟IP地址&#xff08;VIP&#xff1a;192.168.80.100&#xff09; 1.3.调整 proc 响应参数 1.4.配…

springboot 在线心理咨询管理系统-计算机毕业设计源码82552

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设在线心理咨询管理系统…

Elasticsearch index 设置 false,为什么还可以被检索到?

在 Elasticsearch 中&#xff0c;mapping 定义了索引中的字段类型及其处理方式。 近期有球友提问&#xff0c;为什么设置了 index: false 的字段仍能被检索。 本文将详细探讨这个问题&#xff0c;并引入列式存储的概念&#xff0c;帮助大家更好地理解 Elasticsearch 的存储和查…

IO模型和多路转接

叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.IO 概要1.1.IO 低效原因1.2.IO 常见模型1.2.1.阻塞 IO1.2.2.非阻…

shell脚本简单命令

shell脚本 脚本就是可运行代码的集合&#xff0c;脚本语言&#xff08;计算机语言&#xff09;脚本的特点&#xff1a;从上到下&#xff0c;按行执行。 python 脚本语言 格式更严谨 严格的执行锁进。也是从上到下按行执行。 shell脚本就是在shell环境&#xff08;/bin/bash&…

Word忘记保存?请使用Word隐藏备份文件

大家用Word写材料时&#xff0c;如果忘记保存&#xff0c;可以使用Word隐藏备份文件找回未保存的文件。&#xff08;仅供参考&#xff09; Windows7、8、10、11系统的设置如下&#xff1a; 执行上述操作&#xff0c;可以在word文件菜单中信息项的自动保存中找到了。上述内容…

Qt for Android 申请摄像头权限

步骤 1. 添加用户权限 方式1: AndroidManifest.xml 中新增&#xff08;不添加后面申请选项时不弹窗&#xff09; 或者再Qt Creator中直接添加 方式2: .pro 中引用multimedia 模块&#xff0c;编译时配置自动添加 <uses-permission android:name"android.permissi…

我给KTV服务生讲解防抖,他竟然听懂了

端午节三天假期&#xff0c;的最后一天&#xff0c;我和朋友闲来无事&#xff0c;想着去唱会儿歌吧&#xff0c;好久不唱了&#xff0c;于是吃了午饭&#xff0c;石景山就近找了一家KTV&#xff0c;我们团好了卷就过去了。 装修还算不错&#xff0c;很快找到服务生&#xff0c…

Day 43 keepalived高可用集群

keepalived高可用集群 负载均衡 lb集群 load balance ​ 流量分发 高可用 ha集群 high availability ​ 主要是给服务器做冗余 keepalive 持久连接 保持存活 keepalived 高可用软件名称 红帽有自己的高可用集群套件&#xff1a;RHCS keepalived介绍 ​ keepalived是集…

【浏览器清空证书】

chrome://net-internals/#hsts 在地址栏输入并访问&#xff1a;chrome://net-internals/#hsts

[AI Omost] 革命性AI图像合成技术,让你的创意几乎一触即发!

介绍 Omost 是一个创新的项目&#xff0c;它利用大型语言模型&#xff08;LLM&#xff09;的编码能力来生成图像&#xff0c;特别是通过图像合成技术。项目的名称“Omost”发音类似于“almost”&#xff0c;寓意着使用该项目后&#xff0c;用户的图像生成工作几乎可以完成。同…

bbbike下载OSM路网数据后使用GraphHopper离线进行路径规划

一、bbbike下载OSM路网数据 BBBike extracts OpenStreetMap (OSM, Garmin, Shapefile etc.) 二、GraphHopper离线搭建 GraphHopper是一种快速且内存有效的Java导航引擎&#xff0c;默认使用OSM和GTFS数据&#xff0c;也可导入其他的数据源。支持CH&#xff08;Contraction Hi…

如何提高逻辑性?(小妙招)

在现代社会中&#xff0c;逻辑性是一种至关重要的思维能力。不论是在工作、学习还是生活中&#xff0c;逻辑清晰的人总能更好地解决问题和做出决策。然而&#xff0c;如何提高逻辑性却是许多人头疼的问题。本文将从六个方面详细探讨如何提升逻辑性&#xff0c;包括细心态度、逼…

网页宽度现在右侧有一个竖条空白,怎么啦车网站都没办法完全铺满宽度,怎么回事怎么解决

问: 网页宽度怎么设置全覆盖 回答: 经过检查,发现 是这个网站的最外层html标签设置了宽度,所以导致,当我们删除html的宽度后就解决了这个问题.

大模型基础——从零实现一个Transformer(1)

一、Transformer模型架构图 主要模块&#xff1a; embedding层&#xff1a; Input/Output Embedding&#xff1a; 将每个标记(token)转换为对应的向量表示。 Positional Encoding&#xff1a;由于没有时序信息&#xff0c;需要额外加入位置编码。 N个 block堆叠: Multi-Head …

Spring Boot 使用自定义注解和自定义线程池实现异步日志记录

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

树-二叉树的最大路径和

一、问题描述 二、解题思路 因为各个节点的值可能为负数&#xff0c;初始化res(最大路径和)的值为最小整数&#xff1a;Integer.MIN_VALUE 我们这里使用深度遍历&#xff08;递归&#xff09;的方法&#xff0c;先看某一个子树的情况&#xff1a; 这里有一个技巧&#xff0c;…

纷享销客安全体系:安全运维运营

安全运维运营(Security Operations,SecOps)是指在信息安全管理中负责监控、检测、响应和恢复安全事件的一系列运营活动。它旨在保护组织的信息系统和数据免受安全威胁和攻击的损害。 通过有效的安全运维运营&#xff0c;组织可以及时发现和应对安全威胁&#xff0c;减少安全事…

【Linux文件篇】系统文件、文件描述符与重定向的实用指南

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;相信大家对文件都不会太陌生、也不会太熟悉。在没有学习Linux操作系统时&#xff0c;我们在学习C或C时都学过如何去创建、打开、读写等待文件的操作&#xff0c;知道一些语言级别的一些接口与函数。但…