C++动态库

C++动态库

动态库文件(Dynamic Link Library,DLL)是程序在运行时所需要调用的库。静态库文件是程序在编译时所需要调用的库。

1 环境介绍

VS版本:VS2017

编程语言:C++

2 功能介绍

使用VS2017项目模板创建C++动态库生成工程,编写功能函数,并生成动态库;然后再创建一个C++工程调用动态库中的功能函数进行测试。

3 创建动态库

3.1 新建“具有导出项的(DLL)动态链接库”模板

在“新建项目”窗口中,选择“Visual C++ -> Windows桌面 -> 具有导出项的(DLL)动态链接库”,并设置项目名称和位置。本示例的名称设为Dll_Library,存放在G:\C++\Practices中。
在这里插入图片描述

3.2 实现功能函数

创建完成后,该项目下会自动生成一个示例模板:Dll_Library.hDll_Library.cpp。在.h文件中进行函数申明或类定义,在.cpp文件中进行实现。

3.2.1 Dll_Library.h

#ifdef DLLLIBRARY_EXPORTS
#define DLLLIBRARY_API __declspec(dllexport)
#else
#define DLLLIBRARY_API __declspec(dllimport)
#endif// 模板中自动提供的示例
// 此类是从 dll 导出的
class DLLLIBRARY_API CDllLibrary 
{
public:CDllLibrary(void);// TODO: 在此处添加方法。static void Print();
};extern DLLLIBRARY_API int nDllLibrary;
extern DLLLIBRARY_API int fnDllLibrary(void);// 自己编写的功能函数
extern DLLLIBRARY_API void Print(void);
extern DLLLIBRARY_API int sum(int a, int b);

3.2.2 Dll_Library.cpp

// Dll_Library.cpp : 定义 DLL 的导出函数。#include "pch.h"
#include "framework.h"
#include "Dll_Library.h"
#include <iostream>
using namespace std;// 这是导出变量的一个示例
DLLLIBRARY_API int nDllLibrary = 0;// 这是导出函数的一个示例。
DLLLIBRARY_API int fnDllLibrary(void)
{cout << "调用fnDllLibrary成功" << endl;return 0;
}// 这是已导出类的构造函数。
DLLLIBRARY_API CDllLibrary::CDllLibrary()
{return;
}
// 这是实现导出类中的成员函数
DLLLIBRARY_API void CDllLibrary::Print()
{cout << "通过CDllLibrary进行Print" << endl;
}// 实现自己定义的功能函数
DLLLIBRARY_API void Print(void) 
{cout << "直接进行Print" << endl;
}DLLLIBRARY_API int sum(int a, int b)
{int c = a + b;return c;
}

3.3 编译生成动态库

右键点击项目,选择“生成”来编译生成动态库。
在这里插入图片描述
在这里插入图片描述

3.4 调用动态库中功能函数

在“新建项目”窗口中,选择“Visual C++ -> Windows桌面 -> 控制台应用”,并设置项目名称和位置。本示例的名称设为UseDLL,存放在G:\C++\Practices中。

3.4.1 UseDLL.cpp

#include "Dll_Library.h"
#include <iostream>
// 使用DLLLIBRARY.lib
#pragma comment(lib, "DLLLIBRARY.lib")using namespace std;
int main()
{int a = fnDllLibrary();cout << "DLL中的变量nDllLibrary:" << nDllLibrary << endl;CDllLibrary::Print();Print();int b = sum(12, 34);cout << "求和:" << b << endl;return 0;
}

3.4.2 链接.h头文件

由于Dll_Library.h不在UseDLL项目目录中,会提示#include "Dll_Library.h"引用失败。

3.4.2.1 复制Dll_Library.h到UseDLL项目目录中

该方法虽然能够解决该问题,但是在后续修改Dll_Library项目后仍需要重新复制。

3.4.2.2 在UseDLL中配置附加包含目录

右键点击UseDLL项目,选择“属性”,在属性页窗口中:

  1. 将“配置”选择为“所有配置”,“平台”选择为“所有平台”;
  2. 在“配置属性 -> C/C++ -> 常规 -> 附加包含目录”中添加Dll\_Library.h所在目录的路径。
    在这里插入图片描述

3.4.3 链接.lib文件

在使用 #pragma comment(lib, "DLLLIBRARY.lib")时,默认和UseDLL的.cpp文件在同一文件夹下。将DLLLIBRARY.lib文件复制到UseDLL.cpp的同一文件夹下也能够解决问题,但后续修改时仍然需要复制。

3.4.3.1 在UseDLL中配置附加库目录

右键点击UseDLL项目,选择“属性”,在属性页窗口中:

  1. 在“配置属性 -> 链接器 -> 输入 -> 附加依赖项”中添加 DLLLIBRARY.lib。
    在这里插入图片描述

3.4.4 链接.dll文件

当调试运行程序时,会出现“找不到.dll文件”的错误,需要将dll文件拷贝到项目运行目录下,此示例下需要拷贝到G:\C++\Practices\UseDLL\Debug下,通常在程序发布时要这么做,但是在调试时不建议这么做,因为后续修改时需要重新拷贝复制。

3.4.4.1 在UseDLL中配置调试环境

右键点击UseDLL项目,选择“属性”,在属性页窗口中:

  1. 在“配置属性 -> 调试 -> 环境”中添加DLLLIBRARY.dll所在的目录路径。
    在这里插入图片描述

3.5 运行结果

在这里插入图片描述

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

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

相关文章

ARM 基础学习记录 / ARM 裸机编程

汇编程序调用 C 程序详情 在 C 程序和 ARM 汇编程序之间相互调用时必须遵守 ATPCS 规则&#xff0c;其是基于 ARM 指令集和 THUMB 指令集过程调用的规范&#xff0c;规定了调用函数如何传递参数&#xff0c;被调用函数如何获取参数&#xff0c;以何种方式传递函数返回值。 寄存…

为什么要做MBTI职业性格测试?

MBTI职业性格测试是一种成熟的人格测评工具&#xff0c;基于荣格理论发展而来&#xff0c;将人的性格分为16种类型&#xff0c;或内向。或外向&#xff0c;或注重情感&#xff0c;或注重感知。 每种性格各有长处和不足&#xff0c;通过应用mbti职业性格测试&#xff0c;可以方…

暖手宝+充电宝设计方案 可实现快速升温和充电 低成本充电电流可选

充电暖手宝因为它的便携性&#xff0c;既能供暖又能当充电宝使用而备受人们喜爱。是冬天暖手供暖的必备神器。 目前&#xff0c;市场常见的暖手宝大致有三个类型&#xff0c;分别是加热水的热水袋、通过化学反应放热的铁粉袋子和锂电供电的智能暖手宝。与常见的暖手宝不同&…

设计模式之组合模式-创建层次化的对象结构

目录 概述概念主要角色应用场景 组合模式的实现类图NS图基本代码组合模式的精髓意外收获&#xff08;❀❀&#xff09; 应用示例-公司组织架构管理需求结构图代码 组合模式的优缺点优点缺点 总结 概述 概念 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树形结…

jbase代码生成器(成型篇)

上一篇说到通用码表可以解决百分之八十的基础维护功能&#xff0c;剩下的百分二十的需要级联维护的界面可以用代码生成器生成代码&#xff0c;基于生成的代码拷贝再组装界面&#xff0c;来解决这百分之二十的工作量里的百分之八十工作量。 首先实现代码生成器 Class Jbase.Ma…

宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?

当前很多的宠物被抛弃和虐杀&#xff0c;它们没有选择权&#xff0c;我们强制性的把狗带进人类的生活中&#xff0c;然后又无情的抛弃&#xff0c;让它们无家可归&#xff0c;变成流浪狗&#xff0c;它们做错了什么&#xff1f;流浪动物被主人遗弃之后居无定所&#xff0c;时刻…

Pytorch R-CNN目标检测-汽车car

概述 目标检测(Object Detection)就是一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,通俗点说就是给定一张图片要精确的定位到物体所在位置,并完成对物体类别的识别。其准确性和实时性是整个系统的一项重要能力。 R-CNN的全称是Region-CNN(区域卷积神经…

Linux是什么,Linux系统介绍

很多小伙伴都不是那么了解和知道Linux&#xff0c;到底Linux是什么&#xff1f; 像大家用到的安卓手机&#xff0c;生活中用到的各种智能设备&#xff0c;比如路由器&#xff0c;光猫&#xff0c;智能家具等&#xff0c;很多都是在Linux操作系统上。 Linux是什么&#xff1f;Li…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中&#xff0c;因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷&#xff0c;基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

AI:74-基于深度学习的宠物品种识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

视频编软件会声会影2024中文版功能介绍

会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能&#xff0c;用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材&#xff0c;让用户剪辑视频更加的轻松。 会…

LeetCode(2)移除元素【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 27. 移除元素 1.题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原…

赛宁网安入选国家工业信息安全漏洞库(CICSVD)2023年度技术组成员单

近日&#xff0c;由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办的“2023工业信息安全大会”在北京成功举行。 会上&#xff0c;国家工业信息安全发展研究中心对为国家工业信息安全漏洞库&#xff08;CICSVD&#xff09;提供技术支持的单位授牌表彰。北京赛宁…

安装dubbo-admin报错node版本和test错误

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;dubbo-admin安装 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0…

一文入门Springboot+actuator+Prometheus+Grafana

环境介绍 技术栈 springbootmybatis-plusmysqloracleactuatorPrometheusGrafana 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 本地主机应用 192.168.1.9:8007 PrometheusGrafana安装在同一台主机 http://…

【Spring之底层核心架构概念解析】

文章目录 一、BeanDefinition二、BeanDefinitionReader2.1、AnnotatedBeanDefinitionReader2.2、XmlBeanDefinitionReader 五、ClassPathBeanDefinitionScanner六、BeanFactory七、ApplicationContext7.1、AnnotationConfigApplicationContext7.2、ClassPathXmlApplicationCont…

Zeitgeist ZTG Token以及其预测市场加入Moonbeam生态

波卡上的首选多链开发平台Moonbeam宣布与Zeitgeist达成XCM集成&#xff0c;将ZTG Token引入Moonbeam。此集成将使波卡内的Moonbeam和Zeitgeist网络之间的流动性得以流动&#xff0c;并通过Moonbeam的互连合约实现远程链集成。 Zeitgeist是一个基于波卡的Substrate区块链框架构…

数据结构:AVL树的旋转(高度平衡树)

1、AVL树简介 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&#xff0c;他们…

Vuex:模块化Module :VCA模式

VCA中不支持辅助函数&#xff0c;因为辅助函数中是用this.$store&#xff0c;而VCA中没有绑定this的 由于使用单一状态树&#xff0c;应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时&#xff0c;store 对象就有可能变得相当臃肿。 这句话的意思是&#xff0c;…

初识Linux:目录路径

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 一、基本指令&#xff1a; 二、文件 文件内容文件属性 三、ls 指令拓展 1、 ls -l &#xff1a; 2、ls -la&#xff1a; 3、ls [目录名] &#xff1a; 4、ls -ld [目录名]&#xff1a; 四、Linux中的文件和…