返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >使用Visual Studio进行动态链接库开发流程
  • 264
分享到

使用Visual Studio进行动态链接库开发流程

2024-04-02 19:04:59 264人浏览 独家记忆
摘要

一、动态链接库和动态链接 动态链接库:在 windows 中,动态链接库 (DLL) 是作为函数和资源的共享库的一种可执行文件。在调用它们的应用程序的上下文中运行。 动态链接:动态链

一、动态链接库和动态链接

动态链接库:在 windows 中,动态链接库 (DLL) 是作为函数和资源的共享库的一种可执行文件。在调用它们的应用程序的上下文中运行。

动态链接:动态链接是操作系统功能。操作系统将 DLL 加载到应用程序的内存空间中,它可使执行文件调用函数或使用存储在单独文件中的资源。

动态链接库有什么用: DLL 可以在可执行文件之间轻松共享函数和资源。 多个应用程序可同时访问内存中单个 DLL 副本的内容。

二、和静态链接的区别

这部分我们只需要知道静态链接把所有的执行需要的库都打包到可执行文件里面了,动态链接则是把各个库独立出来,在运行时由操作系统将 DLL 加载到应用程序的内存空间中。

在Windows上具体一些就是:

静态链接将静态库中的所有对象代码复制到生成时使用它的可执行文件中。 动态链接仅包括 Windows 在运行时用于查找和加载含有数据项或函数的 DLL 所需的信息。 创建 DLL 时,还将创建包含此信息的导入库。 生成调用 DLL 的可执行文件时,链接器会使用导入库中的导出符号来为 Windows 加载程序存储此信息。 当加载程序加载 DLL 时,该 DLL 会映射到你的应用程序的内存空间中。 如果存在,则调用 DLL 中的特殊函数 DllMain,以执行 DLL 所需的任何初始化。

也可以直接看看微软技术文档的介绍,单击蓝字访问。

三、用VS生成动态库的基本流程

这里我们使用c++语言开发,对于环境有的要求如下:

1、Visual Studio
2、VS中安装了 “C++ 的桌面开发” 工作负载。 如果在安装 Visual Studio 时未安装此工作负载, 可以再次运行安装程序并立即安装。

Visual Studio的安装和配置可以参考这个链接,单击蓝字访问即可。

具体步骤如下:

①在 Visual Studio 2019 中创建 DLL 项目

在菜单栏上,选择“文件”>“新建”>“项目”,打开“创建新项目”对话框 。选择如下图所示的项目类型。

在这里插入图片描述

接下来,创建一个头文件来声明 DLL 导出的函数,然后将函数定义添加到 DLL,使其具备更强大的功能(被其他执行文件调用)。

②将头文件添加到 DLL(.h文件)

若要为函数创建头文件,请在菜单栏上选择“项目” > “添加新项” 。也就是往这个项目里面添加一个头文件,大伙应该都知道咋个弄。
图例添加了一个名为MathLibrary.h 的头文件,这里随意用啥名儿都行,主要看操作步骤。我们统一设定为Diyapi.h

在这里插入图片描述

然后把头文件DiyApi.h的内容写成这样:


#pragma once
//声明一个作为API的函数
//并对函数GetNumber_8()声明设置 __declspec(dllexport) 修饰符。
extern "C" __declspec(dllexport) int GetNumber_8();

这里的函数GetNumber_8()将会作为我们这个DLL的一个API,用于被其它执行文件调用。

__declspec(dllexport)指示编译器和链接器从 DLL 导出函数或变量,以便其他应用程序可以使用它。此修饰符可优化应用程序中函数或变量的导入。可以参阅微软的说明文档,单击蓝字即可查看。

③向 DLL 添加实现(.c文件)

还是强调过程,我们把函数的功能搞得简单点:


#include "DiyApi.h"
#include <stdio.h>

int GetNumber_8()
{
	int ConstNumber = 8;
    return ConstNumber;
}

现在可以编译动态链接库,DLL 和相关编译器输出放在解决方案文件夹正下方的“Debug”文件夹中 。 如果创建发布版本(Realse),该输出会放置在“Release”文件夹中 。 VS的输出应类似于:

在这里插入图片描述

四、如何使用动态链接库

显然,不管是我们自己写的动态库(DLL)还是其他来源的动态库,首先要考虑的问题就是怎么把它用到我们的项目(Project)里。这也就是如何使用动态链接库的问题。

微软文档指出:

若要调用函数或访问由 DLL 导出的数据,客户端源代码必须在编译时具有可用的声明。 在链接时间,链接器需要信息来解析函数调用或数据访问。

也就是说,至少确保两件事情:

① IDE知道动态库的位置,以便编译的顺利进行

② 我们发布的应用程序能够找到动态库,以确保程序能够运行

所以我们一般应该遵循以下原则:

首先,为避免不同步的代码,建议在客户端项目中设置包含路径,使其直接包括 DLL 项目中的 DLL 头文件。
此外,在客户端项目中设置库路径以包括 DLL 项目中的 DLL 导入库。
最后,将生成的 DLL 从 DLL 项目复制到客户端生成输出目录中。 此步骤允许客户端应用使用生成的同一 DLL 代码。

为了清晰地说明这个问题,我们走一遍流程。首先是新建一个工程ApiClient,我们将在这个工程中调用先前编写的DLL中的GetNumber_8().

在这里插入图片描述

添加DLL到工程(编译准备)

接下来,要在源代码中调用 GetNumber_8函数,你的项目必须包括 DiyApi.h 文件 。为避免不必要的麻烦,我们采用以下步骤。

1、右键单击“解决方案资源管理器” 中的“ApiClient” 节点以打开“属性页” 对话框。
2、在“配置”下拉框中,选择“所有配置”(如果尚未选择) 。
3、在左窗格中,选择“配置属性” > “C/C++” > “常规” 。
4、在属性窗格中,选择“附加包含目录” 编辑框旁的下拉控件,然后选择“编辑”

在这里插入图片描述

5、在“附加包含目录” 对话框的顶部窗格中双击以启用编辑控件。 或者,选择文件夹图标以创建新条目。
6、在编辑控件中,指定指向 ApiClient.h 头文件的位置的路径。 可选择省略号 (…) 控件浏览到正确的文件夹 。
还可将客户端源文件中的相对路径输入到包含 DLL 头文件的文件夹。 如果已按照指示将客户端项目置于 DLL 的单独解决方案中,则相对路径应如下所示:


..\..\DiyApi\DiyApi

如果 DLL 和客户端项目位于同一解决方案中,则相对路径可能如下所示:


..\DiyApi

如果 DLL 和客户端项目位于其他文件夹中,请调整相对路径以进行匹配。 或者,使用省略号控件浏览文件夹。
7、在“附加包含项目”对话框中输入标头文件的路径后,选择“确定”按钮 。 在“属性页”对话框中,选择“确定”按钮以保存更改 。

现在可以包括 DiyApi.h 文件,并使用它在客户端应用程序中声明的函数。 相应的ApiClient.cpp 的内容如下:


#include "DiyApi.h"
#include <iOStream>

using namespace std;
 
int main()
{
	const magicNumber = 8;
	
	for(int i=magicNumber;i>0;i--){
		cout<<GetNumber_8<<endl;
	}
	return 0;
}

尝试编译运行编译,很棒😀,咱们可以得到一堆报错,至少有下面这条:


LNK2019 :你尚未指定项目在 DiyApi.lib 库上有依赖项

因为咱们还没告诉链接器如何查找 DiyApi.lib 文件 。编译之前,我们还应该应该设置项目中的“附加库目录” 路径,使其在链接时包含指向原始库的路径,即将 DLL 导入库添加到项目中。

将 DLL 导入库添加到项目中(链接准备)

1、右键单击“解决方案资源管理器”中的ApiClient节点,然后选择“属性”以打开“属性页”对话框 。
2、在“配置”下拉框中,选择“所有配置”(如果尚未选择) 。 它可确保任何属性更改同时应用于调试和发布版本。
3、在左窗格中,选择“配置属性” > “链接器” > “输入” 。 在属性窗格中,选择“附加依赖项” 编辑框旁的下拉控件,然后选择“编辑” 。

在这里插入图片描述

4、在“附加依赖项”(Additional Dependencies)对话框中,将 DiyApi.lib 添加到顶部编辑控件的列表中 。
5、选择“确定” 返回到“属性页” 对话框。
6、在左窗格中,选择“配置属性” > “链接器” > “常规” 。 在属性窗格中,选择“附加库目录” 编辑框旁的下拉控件,然后选择“编辑” 。
7、在“附加库目录” 对话框的顶部窗格中双击以启用编辑控件。 在编辑控件中,指定指向 DiyApi.lib 文件位置的路径。 默认情况下,它位于 DLL 解决方案文件夹下的Debug文件夹中 。 如果创建发布版本,该文件会放置在Release文件夹中 。 可以使用 $(IntDir) 宏,这样无论创建的是哪种版本,链接器都可找到 DLL。 如果已按照指示将客户端项目置于 DLL 项目的单独解决方案中,则相对路径应如下所示:


..\..\DiyApi\$(IntDir)

如果 DLL 和客户端项目位于其他位置,请调整相对路径以进行匹配。
8、在“附加库目录”对话框中输入指向库文件的路径后,选择“确定”按钮返回到“属性页”对话框 。 选择“确定”以保存属性更改 。

把DLL复制到应用文件夹(运行准备)

客户端应用现在可以成功编译和链接,但还不能运行。 当操作系统加载应用时,它会查找 DiyApi.DLL。 如果在某些系统目录、环境路径或本地应用目录中找不到 这个DLL,那么这个应用自然就不能运行了。

故而我们还需要DLL 复制到包含可执行文件的目录中,这也就是“打包发布”过程的一部分。

当然了,VisualStudio提供了对应的命令,不想手动打包的可以参考微软文档中对在生成后事件中复制 DLL的说明,单击即可蓝字查看。

到此这篇关于使用Visual Studio进行动态链接库开发的的文章就介绍到这了,更多相关Visual Studio动态链接库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用Visual Studio进行动态链接库开发流程

本文链接: https://lsjlt.com/news/125304.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用Visual Studio进行动态链接库开发流程
    一、动态链接库和动态链接 动态链接库:在 Windows 中,动态链接库 (DLL) 是作为函数和资源的共享库的一种可执行文件。在调用它们的应用程序的上下文中运行。 动态链接:动态链...
    99+
    2024-04-02
  • Linux动态链接库的使用
    动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,...
    99+
    2022-06-04
    Linux 动态链接库
  • Rust使用libloader调用动态链接库
    目录引言main.rs 代码引言 最近需要使用Rust动态调用动态链接库,本来打算是使用libloading的,但是libloading在调用dll中的函数的时,是必须要在编译时确定...
    99+
    2024-04-02
  • 使用Visual Studio 2022开发前端的详细教程
    目录创建宿主项目安装前端库在浏览器引入模块模块化开发前端开发环境多数基于Node.js,好处不多说了。但与使用Visual Studio开发的后端Asp.Net Core项目一起调试...
    99+
    2024-04-02
  • C#跨平台开发之使用C/C++生成的动态链接库
    操作环境:Visual Studio 2017 如何实现 使用 C# 进行嵌入式开发? .NET Core 虽然实现了跨平台,但是不可能处处使用 C# 开发,就好像没人使用SQL开发...
    99+
    2024-04-02
  • linux动态链接库的使用方法
    这篇文章主要介绍“linux动态链接库的使用方法”,在日常操作中,相信很多人在linux动态链接库的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux动态链接库的使用方法”的疑惑有所帮助!接下来...
    99+
    2023-06-09
  • 怎么使用Visual Studio 2022开发Linux、C++应用程序
    本篇内容介绍了“怎么使用Visual Studio 2022开发Linux、C++应用程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2023-06-21
  • linux动态链接库使用方法分享
    1、前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之...
    99+
    2022-06-04
    使用方法 动态链接库 linux
  • 使用 Visual Studio 2022 开发 Linux C++ 应用程序的过程详解
    使用 Visual Studio 2022 开发 Linux C++ 应用程序 使用 Visual Studio 2022 with WSL2 ! Visual Studio 202...
    99+
    2024-04-02
  • 详解C++中OpenSSL动态链接库的使用
    在上一篇文章 OpenSSL动态链接库源码安装 中我们介绍了如何在Windows和Linux环境中编译OpenSSL动态链接库,这篇文章我们将介绍如何在C代码中引用Open...
    99+
    2024-04-02
  • 怎么使用C/C++生成的动态链接库
    这篇文章主要讲解了“怎么使用C/C++生成的动态链接库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C/C++生成的动态链接库”吧!操作环境:Visual Studio 2017.N...
    99+
    2023-06-26
  • 详解PyCharm使用pyQT5进行GUI开发的基本流程
    目录一、环境安装1、安装Pycharm2、安装pyQT53、创建工程二、配置扩展工具 1、配置Qt Designer2、配置转换工具三、GUI设计1、打开Qt Design...
    99+
    2024-04-02
  • 使用Django进行测试驱动开发
    目录创建项目配置 app编写测试用例编写代码执行测试最后的话所谓测试驱动开发(TDD),就是先编写测试用例,然后编写代码来满足测试用例,具体包含以下步骤: 编写测试用例。 ...
    99+
    2024-04-02
  • 使用VSCode的Remote-SSH连接Linux进行远程开发
    安装Remote-SSH并配置 首先打开你的VSCode,找到Extensions,搜索Remote,下载Remote-Developoment插件,会自动安装其他的Remote插件,其中会包含Remote-SSH: ...
    99+
    2022-06-04
    VSCode Remote-SSH连接Linux Remote-SSH连接Linux
  • 如何使用React进行组件库开发
    小编给大家分享一下如何使用React进行组件库开发,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概述我们都知道,组件化的开发模式...
    99+
    2024-04-02
  • 使用PHP和Kotlin进行移动端开发
    现今移动端开发已经成为了一个重要的领域,越来越多的开发者将使用PHP和Kotlin进行移动端应用开发。这种方式的优点包括速度快、易于学习和深受开发者喜爱。在本文中,我们将深入了解PHP和Kotlin的优点,以及为什么它们成为移动端开发的首选...
    99+
    2023-05-24
    PHP kotlin 移动端开发
  • 使用VSCode和SSH进行远程开发
    0.为什么需要远程开发 在进行嵌入式linux开发的时候,为了方便,通常在Windows上使用代码编辑器编辑代码,交叉编译工具在Linux虚拟机或者服务器上,在开发期间需要不停的进行如下的循环操作: 编辑好代码,使...
    99+
    2022-06-04
    VSCode SSH远程 VSCode SSH 开发
  • 如何使用Django进行测试驱动开发
    本篇内容介绍了“如何使用Django进行测试驱动开发”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!所谓测试驱动开发(TDD),就是先编写测试...
    99+
    2023-06-21
  • ASP 开发技术学习笔记:如何使用 Visual Studio 打包您的应用程序?
    ASP.NET 是一个非常流行的 Web 应用程序框架,它允许开发者使用多种语言(如 C# 和 VB.NET)来构建动态网站和 Web 应用程序。在 ASP.NET 中,您可以使用 Visual Studio 来编写代码、创建用户界面、调...
    99+
    2023-09-09
    开发技术 学习笔记 打包
  • 怎么使用VS2019进行Linux远程开发
    本篇内容介绍了“怎么使用VS2019进行Linux远程开发”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Visual Studio的跨平台开...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作