C++动态库

news2024/11/24 22:49:45

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.coloradmin.cn/o/1193801.html

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

相关文章

(论文阅读24/100)Visual Tracking with Fully Convolutional Networks

文献阅读笔记&#xff08;sel - CNN&#xff09; 简介 题目 Visual Tracking with Fully Convolutional Networks 作者 Lijun Wang, Wanli Ouyang, Xiaogang Wang, and Huchuan Lu 原文链接 http://202.118.75.4/lu/Paper/ICCV2015/iccv15_lijun.pdf 【DeepLearning】…

AMESim 2021安装教程

主要是AMESim的安装 写在前面&#xff0c;由于项目需要&#xff0c;需要自学AMESim&#xff0c;因此需要安装这个软件&#xff0c;目前仅仅安装使用&#xff0c;还不涉及到与MATLAB的联合仿真&#xff0c;老板说用 RT LAB半实物仿真平台&#xff0c;但是简单搜了一下&#xff0…

单链表(4)

看尾插函数 尾插函数跟头插函数唯一的不同就是找尾巴 尾插函数&#xff1a; 首先是动态申请一个新结点 把val放到新结点里面当新结点的data 然后在单链表里面找尾巴 比如说指针p找到尾巴了&#xff0c;现在将指针p指向新的结点&#xff0c;尾插就好了 这里的p类似于头插函…

AIX5.3安装weblogic10.3

目录 1安装IBM JDK 1.6 2图形化准备 3安装weblogic 准备 4图形化界面安装 1安装IBM JDK 1.6 1.1检查操作系统 # oslevel 5.3.0.0 # bootinfo -y (显示AIX机器硬件是64位) 64 # bootinfo -K (显示AIX系统内核是64位) 64 因此&#xff0c;系统需要安装64位的jdk&#xff0c;…

STM32C8T6实现微秒延时函数delay_us

/* USER CODE BEGIN 0 */ void delay_us(uint32_t ii) {uint32_t temp;SysTick->LOADii*8;SysTick->VAL0x00;SysTick->CTRL0x01;//2号位1使用内核时钟do{tempSysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));SysTick->CTRL0X00;SysTic…

【Unity插件】分享几个完全免费的2D角色动画生成器(推荐收藏)

文章目录 前言一、lpc-character-generator二、Universal-LPC-Spritesheet-Character-Generator三、UP主开发的2D人物换装系统四、Character Editor: Megapack完结 前言 你可能游戏开发能力很强&#xff0c;但是正愁于2D角色动画&#xff0c;那么这篇文章就是为你而准备的&…

深度学习之各种配置环境

如何使用python进行深度学习&#xff0c;我们需要配置相应的环境 第一步&#xff1a;先安装python python的官网地址&#xff1a;https://www.python.org/ 点进去&#xff0c;点击 Downloads&#xff0c;然后点击 Windows 等待下载完成&#xff0c;安装步骤请参考下文&#x…

超声波俱乐部分享:Enter AI native application

11月5日&#xff0c;2023年第十四期超声波俱乐部内部分享会在北京望京举行。本期的主题是&#xff1a;Enter AI native application。 到场的嘉宾有&#xff1a;超声波创始人杨子超&#xff0c;超声波联合创始人、和牛商业创始人刘思雨&#xff0c;蓝驰创投合伙人刘勇&#xf…

关于有源电力滤波器在地铁站低压配电系统中的应用分析

安科瑞 崔丽洁 摘要&#xff1a;作为国家提出的绿色电网、节能降耗已成为现代化企业努力的目标&#xff0c;也是企业急需解决的问题。作为地铁车站这类市政公共交通建筑的着重系统——配电系统。实现绿色电网实质上是解决电网中存在的各种电能问题&#xff0c;主要是涉及到谐波…

倍福CX9020 Windows CE6.0安装中文字库方法(附字库文件)

应用背景介绍 倍福的EPC产品有些是附带Windows CE系统的&#xff0c;例如CX9020&#xff0c;而且多数系统都是英文的&#xff0c;而且没有附带中文的字库&#xff0c;如果想要在PLC HMI中使用中文进行显示就无法实现&#xff0c;经常有工程师在电脑上编好程序和界面以后测试没…

10. GPIO中断

10. GPIO中断 回顾stm32中断系统STM32中断向量表中断向量偏移NVIC中断控制器 Cortex_A7 中断系统中断向量表GIC控制器中断IDGIC逻辑分块CP15协处理器c0寄存器c1寄存器c12寄存器c15寄存器 中断使能中断优先级设置优先级数配置 GICC_PMR抢占优先级和子优先级位数设置 GICC_BPR优先…

Linux---(五)三大工具yum、vim、gcc/g++

文章目录 一、yum工具1.Linux中安装软件的方法&#xff1a;2.什么是yum?3.yum源更新 二、Linux编辑器--vim1.IDE例子2.vim&#xff08;1&#xff09;vim的常用模式及切换模式&#xff08;2&#xff09;底层模式常用命令&#xff08;3&#xff09;插入模式常用命令&#xff08;…

C#操作注册表的方法

注册表是Microsoft Windows操作系统中的一个重要组成部分&#xff0c;用于存储和管理系统和应用程序的配置信息。它是一个层次结构的数据库&#xff0c;以树形结构组织&#xff0c;类似于文件系统中的文件夹和文件。 注册表存储了许多与操作系统和软件相关的信息&#…

分享Python的十大库,这你一定得知道!

文章目录 前言关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Python为我们提供了非常完善的基础库&#…

黑马程序员微服务SpringCloud实用篇02

SpringCloud实用篇02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我…

力扣876:链表的中间结点

力扣876&#xff1a;链表的中间结点 题目描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5]…

计算机是如何进行工作的+进程和线程

一)计算机是如何工作的? 指令是如何执行的?CPU基本工作过程&#xff1f; 假设上面有一些指令表&#xff0c;假设CPU上面有两个寄存器A的编号是00&#xff0c;B的编号是01 1)第一个指令0010 1010&#xff0c;这个指令的意思就是说把1010地址上面的数据给他读取到A寄存器里面 2…

【C++】异常 智能指针

C异常 & 智能指针 1.C异常1.1.异常的抛出与捕获1.2.异常体系1.3.异常安全与规范1.4.异常优缺点 2.智能指针2.1.RAII2.2.智能指针的使用及原理2.2.1.auto_ptr2.2.2.unique_ptr2.2.3.shared_ptr2.2.4.shared_ptr的循环引用问题 & weak_ptr 2.3.定制删除器 1.C异常 C异常…

《算法通关村——二分查找在旋转数字中的应用》

《算法通关村——二分查找在旋转数字中的应用》 这里我们直接通过一个题目&#xff0c;来了解二分查找的应用。 153. 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&a…

Netty入门指南之NIO 网络编程

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言基础扫…