VS中动态库的创建和调用

VS中动态库的创建和调用

是写好的现有的,成熟的,可以复用的代码。库的存在形式本质上来说库是一种可执行代码的二进制。

​ 库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接阶段,静态库的链接阶段是在项目编译的时候静态链接。动态库是在程序运行的时候由代码加载链接。

​ 静态库和动态库的区别主要是在链接阶段处理库的方式不同而区分的。

静态库

概念

​ 静态库指的是在链接阶段直接将库和目标文件一起打包成可执行文件的方式所使用的库就称为静态库。

体现形式

​ .a 或者 .lib 文件

优缺点

优点 :①使可执行文件依赖项少,已经被打包到可执行文件中了。 ②编译阶段完成链接,执行期间代码装载速度快

缺点:①使可执行文件变大。②若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包。③升级不方便,升级必须重新编译

静态库的创建
  1. 使用VS创建一个空项目;
  2. 创建空项目之后将项目设置为静态库(点击项目 -> 属性 -> 常规 -> 配置类型)中修改;
  3. 配置项目lib输出位置(常规 -> 输出目录 :指的是dll输出的文件位置);
  4. 书写接口,在静态库中,只要是可以允许访问的函数和类都可以被使用,没有特别的函数导入和导出。

例程:

#pragma once
#include <iostream>class Arithmetic
{
public:// Returns a + bstatic double Add(double a, double b);//可以调用// Returns a - bstatic double Subtract(double a, double b);//可以调用// Returns a * bstatic double Multiply(double a, double b);//可以调用// Returns a / bstatic double Divide(double a, double b);//可以调用void fun2();//可以调用private:static void fun();//不可以调用void fun1();//不可以调用
};
#include "Arithmetic.h"double Arithmetic::Add(double a, double b)
{return a + b;
}double Arithmetic::Subtract(double a, double b)
{return a - b;
}double Arithmetic::Multiply(double a, double b)
{return a * b;
}double Arithmetic::Divide(double a, double b)
{return a / b;
}void Arithmetic::fun2() {std::cout << "公共  void Arithmetic::fun2()" << std::endl;
}void Arithmetic::fun() {std::cout << "私有  static void Arithmetic::fun()" << std::endl;
}
void Arithmetic::fun1() {std::cout << "私有  void Arithmetic::fun1()" << std::endl;
}
静态库的调用
  1. 创建一个项目
  2. 配置项目属性,导入静态库位置。
  3. 导入头文件:C/C++ -> 常规 -> 附加包含目录 :指的是需要使用的自己编写的头文件
  4. 导入库文件:链接器 -> 常规-> 附加库目录 :指的是在调用的时候声名需要使用的lib文件。
  5. 添加导入lib名称:链接器 -> 输入 -> 附加依赖项 :指的是在调用的时候声名需要使用的lib文件。
  6. 引入库的头文件,之后直接使用库即可。

动态库

概念

动态库指的是在程序运行过程中动态加载库的方式使用的库,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。

体现形式

​ .DLL、.lib 和 .a 、.so ;

优缺点

好处:程序自身的体积不会因为动态函数库变大。
缺点:就是程序运行过程中使用到了这些函数库内的功能时,万一系统特定的位置没有对应的动态库。就会造成程序崩溃或者各种奇怪的问题。

动态库的创建

在介绍动态库的创建之前,我们先来了解以下的宏。

#pragma once
#ifdef PUBFUN_EXPORTS
#define PUBUTIL_DLL __declspec(dllexport)
#else
#define PUBUTIL_DLL __declspec(dllimport)
#endif

MSVC编译器提供了一系列C/C++的扩展来指定符号的导入导出,即__declspec属性关键字。

dllexport与dllimport存储级属性是微软对C和C++的扩展,可用于从dll中导入或导出函数、数据、对象(objects)

__declspec(dllexport) 表示该符号是从本DLL导出的符号。

__declspec(dllimport) 表示该符号是从别的DLL中导入的。

我们在创建动态库的时候需要用到上面的宏。

创建方式1:使用空项目

  1. 使用VS创建一个空项目;
  2. 创建空项目之后将项目设置为动态库(点击项目 -> 属性 -> 常规 -> 配置类型)中修改;
  3. 配置项目lib 和 DLL 输出位置(常规 -> 输出目录 :指的是dll输出的文件位置);
  4. 创建一个header.h (此文件名可以自由定义)定义之后将上面的宏写入到文件中(宏名称可以自己定义)。
  5. 使用定义的宏定义动态库导出的函数或者类。
  6. 编译生成动态库。

例程:

创建动态库导出导入宏

//header.h
#pragma once
#ifdef BD_TEST
#define BDTEXT_DLL __declspec(dllimport)
#else
#define BDTEST_DLL __declspec(dllexport)
#endif

使用宏定义导出的函数

//testDLL.h
#pragma once
#include "header.h"int  BDTEXT_DLL add(int a, int b);

导出函数功能的实现

//testDLL.cpp
#include "testDLL.h"int add(int a, int b) {return a + b;
}

编译:

在这里插入图片描述
这就是最后编译出来的lib和dll库。

创建方式2:直接创建动态库项目

使用直接创建动态库项目,会在项目中生成一个dllMain.cpp的文件。如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

根据微软官网说明:

DllMain是动态链接库 (DLL) 的可选入口点。 当系统启动或终止进程或线程时,它将使用进程的第一个线程为每个加载的 DLL 调用入口点函数。 使用 LoadLibraryFreeLibrary 函数加载或卸载 DLL 时,系统还会调用 DLL 的入口点函数。

之后其他的接口函数和接口类和空项目的建立是一样的。

动态库的调用
  1. 创建一个项目
  2. 导入头文件:C/C++ -> 常规 -> 附加包含目录 :指的是需要使用的自己编写的头文件
  3. 导入库文件:链接器 -> 常规-> 附加库目录 :指的是在调用的时候声名需要使用的lib文件。
  4. 添加导入lib名称:链接器 -> 输入 -> 附加依赖项 :指的是在调用的时候声名需要使用的lib文件。
  5. 引入库的头文件,之后直接使用库即可。
  6. 将于lib配套的dll放到执行文件exe所在的文件目录下。

例程:

配置头文件

在这里插入图片描述

配置lib文件位置

在这里插入图片描述

配置需要使用lib文件

在这里插入图片描述

配置完成之后编写代码

#include <iostream>
#include <testDLL.h>//引入头文件int main() {std::cout << add(2, 5) << std::endl; //调用库中的函数getchar();return 0;
}

注意点:

1、没有设置为导出的函数名称或者类,无法在外部调用dll使用。导出的函数和类必须使用导出宏修饰。

项目常见配置项

常规 -> 输出目录 :指的是dll输出的文件位置

常规 -> 中间目录 :指的是中间件的输出位置

常规 -> 配置类型 :指的是项目类型

VC++目录 -> 包含文件 :指的是三方库文件的头文件位置

VC++目录 -> 库目录 : 指的是三方库文件(.dll .lib)文件

C/C++ -> 常规 -> 附加包含目录 :指的是需要使用的自己编写的头文件

C/C++ -> 预处理器 -> 预处理器定义 : 指的是我们需要配置的宏定义

链接器 -> 输入 -> 附加依赖项 :指的是在调用的时候声名需要使用的lib文件。

链接器 -> 高级 -> 导入库 : 指的是lib导出的文件位置

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

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

相关文章

一键操作完整的部署项目流程

目录 一、常见的搭配 二、完整的部署项目流程具体步骤 2.1、安装jdk 安装jdk &#xff1a; 配置环境&#xff1a; 检查是否成功&#xff1a; 2.2、配置tomcat外部访问 下载解压软件 安装tomcat 测试tomcat安装是否成功 2.3、安装MySQL 安装vcc环境 命令输入步骤 安…

应用在热能表领域中的数字温度传感芯片

热能表&#xff0c;是适用于测量在热交换环路中&#xff0c;被称作载热液体的液体所吸收或转换热能的仪器&#xff0c;它由流量传感器、温度传感器和热能积算仪三部分组成。热量表&#xff08;热表&#xff09;又称热能表、热能积算仪&#xff0c;既能测量供热系统的供热量又能…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息&#xff0c;与bridge相比&#xff0c;融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…

K8S集群重新初始化--详细过程

K8S集群重新初始化 0、当前环境1、master节点1.1、在master节点执行下面reset命令&#xff1a;1.2、手动清除配置信息&#xff0c;这一步很关键&#xff1a;1.3、重新引导集群1.4、创建配置目录&#xff0c;并复制权限配置文件到用户目录下&#xff1a;1.5 查看集群状态1.6 安装…

小红书私信组件功能解读,商家如何使用

今年八月&#xff0c;小红书私信组件上新了两大新功能。新功能的出现&#xff0c;无疑为商家与消费者的沟通建联&#xff0c;提供了新的可能。今天我们来针对小红书私信组件功能解读&#xff01; 一、小红书私信组件新功能 这次小红书私信组件上新的两大功能分别是&#xff0c;…

GEE查看SMAP的L3级土壤水分产品并导出为TIFF

SMAP的L3级产品&#xff0c;时间分辨率为每日&#xff0c;空间分辨率为9KM&#xff0c;到2023年12月2日停止提供。 查看逐日的土壤水分变化 // 设置感兴趣区域&#xff08;Region of Interest&#xff09; var roi ee.FeatureCollection(projects/a-flyllf0313/assets/dacha…

【Spring Cloud】微服务架构演变及微服务架构介绍

文章目录 系统架构演变单体应用架构垂直应用架构分布式架构SOA 架构微服务架构 微服务架构介绍微服务架构的常见问题微服务架构的常见概念服务治理服务调用服务网关服务容错链路追踪 微服务架构的常见解决方案ServiceCombSpringCloudSpring Cloud Alibaba 总结 欢迎来到阿Q社区…

探索web技术与低代码开发的融合应用

随着物联网、云计算和人工智能等技术的迅猛发展&#xff0c;现代软件开发正面临着日益增长的需求和复杂性。为了应对这一挑战&#xff0c;一种被称为低代码开发的快速、可视化开发方法逐渐崭露头角。本文将探讨低代码开发与web技术的融合应用&#xff0c;以及这种趋势对软件开发…

答题小程序源码系统:自带流量主广告位+视频激励广告 带完整的代码安装包以及搭建教程

随着互联网的迅速发展&#xff0c;各种应用程序层出不穷&#xff0c;而答题类小程序由于其独特的互动性和吸引力&#xff0c;成为了当前最热门的应用之一。答题小程序源码系统是一款基于微信小程序开发的源代码系统&#xff0c;它具有丰富的功能和灵活的定制性&#xff0c;可以…

git修改最新提交(commit)信息

一、修改最近一次commit信息 1、首先通过git log查看commit信息 2、使用命令git commit --amend进入命令命令模式&#xff0c;按i进入编辑模式&#xff0c;修改好commit信息后按Esc键退出编辑模式&#xff0c;然后输入:wq保存编辑信息&#xff08;注意使用英文输入法&#xf…

win10在启动游戏时报错,提示“d3dx9_25.dll文件丢失”,怎么办?d3dx9_25.dll丢失如何自动修复

一、d3dx9_25.dll文件是什么&#xff1f; d3dx9_25.dll是DirectX的一部分&#xff0c;DirectX是一种由微软开发的专门处理与多媒体、游戏程序和视频相关的应用程序接口。d3dx9_25.dll文件是DirectX9中一个重要的dll文件&#xff0c;主要负责处理3D图形程序&#xff0c;作用是帮…

时至今日,编制与大厂到底怎么选?

我觉得这可能是一个辩论三天三夜也不会有结论的话题。 说实话&#xff0c;2023年已经过去&#xff0c;真的没有感觉赚钱更容易&#xff0c;反而是周边失业的同事不少。 现在感觉&#xff0c;是不是选择早点进入编制可能更加稳定&#xff1f;你们又怎么看&#xff1f;

挖种子小游戏

欢迎来到程序小院 挖种子 玩法&#xff1a;看到种子点击鼠标左键进行挖种子&#xff0c;30秒内看你能够挖多少颗种子&#xff0c;快去挖种子吧^^。开始游戏https://www.ormcc.com/play/gameStart/251 html <canvas id"canvas" width"640" height"…

怎样创建vue项目(分别基于vue-cli和vite两种的创建方式)

一、基于vue-cli脚手架创建 1、安装node.js 1、首先需要安装node.js&#xff0c;推荐下载地址&#xff1a;Node.js 2、检查是否安装成功&#xff0c;使用打开黑窗口的快捷键windowR&#xff0c;输入cmd&#xff0c;在黑窗口输入node -v&#xff0c;如果输出版本号&#xff0…

基于STM32的温室大棚环境检测及自动浇灌系统设计

需要全部资料请私信我&#xff01; 基于STM32的温室大棚环境检测及自动浇灌系统设计 一、绪论1.1 研究背景及意义1.2 研究内容1.3 功能设计 二、系统方案设计2.1 总体方案设计 三、系统硬件设计3.1 STM32单片机最小系统3.2 环境温度检测电路设计3.3 土壤湿度检测电路设计3.4 光…

“三指针法“合并两个有序数组(力扣每日一练)

我的第一想法确实是&#xff1a;先合并数组&#xff0c;再排序&#xff0c;搞完。 哈哈哈&#xff0c;想那么多干嘛&#xff0c;目的达成了就好了。 力扣官方题解是双指针&#xff1a; 还有糕手&#xff1a; Python&#xff1a; def merge(nums1, m, nums2, n):# 两个指针分别…

Golang基础入门及Gin入门教程(2024完整版)

Golang是Google公司2009年11月正式对外公开的一门编程语言&#xff0c;它不仅拥有静态编译语言的安全和高性能&#xff0c;而 且又达到了动态语言开发速度和易维护性。有人形容Go语言&#xff1a;Go C Python , 说明Go语言既有C语言程序的运行速度&#xff0c;又能达到Python…

C# winform应用

C# winform应用 需求&#xff1a;导入Excel文件时需要执行其他操作&#xff0c;实现如果取消导入就不执行其他操作 C#代码实现 private bool DLimport0(string tablename, string datebasename, string buttonname){string xxx "";string Tag "";stri…

C++核心编程——类和对象(一)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

美易官方:诡异一幕!美国通胀数据超预期上升降息预期却不降反升

美国通胀数据超预期上升&#xff0c;降息预期却不降反升&#xff0c;这一诡异一幕引发了市场对于美联储政策走向的猜测和担忧。在经济全球化的大背景下&#xff0c;美国作为全球最大的经济体&#xff0c;其货币政策对于全球经济具有重要影响。因此&#xff0c;这一诡异一幕不仅…