windows下dll文件的创建详细教程

1、前言

dll文件是啥,就不作过多赘述了。现在直接教大家如何创建与使用dll文件。
本文基于windows系统,使用的编译相关工具为visual studio 2019。

2、创建dll

2.1 创建dll工程

首先打开visual studio,然后选择创建新项目,在搜索框中输入dll,然后选择下面的动态链接库(DLL)即可,然后点击下一步。
在这里插入图片描述
在配置新项目这一步,可以根据自己的需要,设置
项目名称
位置等即可。设置前好之后点击创建即可。
在这里插入图片描述

2.2 删除多余的文件并添加源文件

在创建的dll解决方案中可以看到,系统已经预生成了一些头文件和源文件。这些是系统预生成的,本身与创建dll关系不是很大,为了帮助大家理解。可以暂时先移除这些文件。
移除这些文件的方法是,依次在每个文件上右键,然后选择移除
这样就可以移除每个文件
在这里插入图片描述
移除完之后,源文件、头文件目录均为空,然后就可以添加文自己的文件了。

首先在头文件目录上右键,然后选择添加 - ->新建项
在这里插入图片描述
然后选择标头,然后输入标头文件名即可。
在这里插入图片描述
然后用同样的方法,在源文件目录上右键,然后选择添加 -> 新建项
然后选择c++源文件,然后输入源文件名。
操作完成之后,可以看到头文件和源文件目录下面分别各有一个文件。
在这里插入图片描述

2.3 编写源文件

首先编写头文件,内容如下:

// math.h
#ifdef MYDLL_EXPORTS
#define MATH_API __declspec(dllexport)
#else
#define MATH_API __declspec(dllimport)
#endif
MATH_API int Add(int a, int b);
MATH_API int Sub(int a, int b);

这里需要做一个简单的说明:
由于这个头文件,dll本身源文件(math.cpp)以及使用dll的文件都会使用,因此需要一个导出接口和一个导入接口。
对于dll文件本身来说,它需要一个导出接口,这样这个dll文件才能被其它程序调用;
对于其它程序来讲,它需要一个导入接口,这样就可以导入dll文件并使用了。
为了到达这个目的,通过条件编译的方式,在本工程中会自动定义一个宏MYDLL_EXPORTS, 这样dll文件项目本身就是导入接口,由于在其他项目中没有定义宏MATH_EXPORTS,这样就会使用导入接口。
下面接着编写源文件,源文件内容如下:

// math.cpp
#include "math.h"
int Add(int a, int b) {return a + b;
}
int Sub(int a, int b) {return a - b;
}

2.3 生成dll文件

在生成dll之前,还需要明确生成的版本,到底是release版本,还是debug版本,到底是x64,还是x86。
这里本身可能影响不大,但是dll的版本和使用dll的版本一定要一致。比如生成dll使用的debug/x64,那么使用dll文件的项目,也只能是debug/x64。

然后在myDll解决方案上右键,点击生成即可。
在这里插入图片描述
不出意外的话,生成结果是失败的,并且提示:
在这里插入图片描述
这是因为我们在步骤2.1中删除了一些文件。
这是需要删除相关预编译头。具体做法如下:
在myDll解决方案上右键 -> 属性,在预编译头选择不使用预编译头。
在这里插入图片描述
在这里插入图片描述
设置好之后,然后重新生成,就可以在相关目录下面看到生成的dll文件了。
在这里插入图片描述
至此dll文件就生成成功,然后其它项目就可以调用该dll文件了。

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

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

相关文章

【springboot启动报错】java: 错误: 无效的源发行版:17

报错截图 解决方案 第一步:编辑配置,改为想用的jdk版本 第二步:文件--->项目结构,改为对应的SDK 第三步:文件--->设置--->构建、执行、部署--->编译器--->Java编译器,修改目标字节码版本 第…

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目: 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …

面试热题(最大子数组和)

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续…

Django框架-使用celery(一):django使用celery的通用配置,不受版本影响

目录 一、依赖包情况 二、项目目录结构 2.1、怎么将django的应用创建到apps包 三、celery的配置 2.1、celery_task/celery.py 2.2、celery_task/async_task.py 2.3、celery_task/scheduler_task.py 2.4、utils/check_task.py 四、apps/user中配置相关处理视图 4.1、基本…

maven的入门使用

maven的入门使用 1.Maven(Maven Apache)是一个流行的项目构建和管理工具,2.项目结构和POM文件:3.POM文件(Project Object Model)4.依赖管理: 在POM文件中5.生命周期和构建过程1.前言2.插件系统3…

MySQL语句总和之MySQL数据库与表结构操作

目录 1、启动MySQL服务 2、进入MySQL数据库 3、退出数据库 4、查看MySQL数据库所有库 5、创建、删除、使用、查看所处库操作 6、创建表 7、查看表结构 8、表结构操作 1)修改表名 2)自增长操作 3)添加一个address字段放在Phone字段后面 4)添加…

c++ 有元

友元分为两部分内容 友元函数友元类 友元函数 问题&#xff1a;当我们尝试去重载operator<<&#xff0c;然后发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作 数了。…

LeetCode 36题:有效的数独

题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff…

【JavaEE进阶】Spring 更简单的读取和存储对象

文章目录 一. 存储Bean对象1. 配置扫描路径2. 添加注解存储 Bean 对象2.1 使用五大类注解存储Bean2.2 为什么要有五大类注解&#xff1f;2.3 有关获取Bean参数的命名规则 3. 使用方法注解储存 Bean 对象3.1 方法注解储存对象的用法3.2 Bean的重命名3.3 同⼀类型多个 Bean 报错 …

Vue前端 更具router.js 中的meta的roles实现路由卫士,实现权限判断。

参考了之篇文章 1、我在登陆时获取到登录用户的角色名roles&#xff0c;并存入sessionStorage中&#xff0c;具体是在login页面实现&#xff0c;还是在menu页面实现都可以。在menu页面实现&#xff0c;可以显得登陆快一些。 2、编写router.js&#xff0c;注意&#xff0c;一个…

Maven 基础之依赖管理、范围、传递、冲突

文章目录 关于依赖管理坐标和 mvnrepository 网站pom.xml 中"引"包 依赖范围依赖传递依赖冲突 关于依赖管理 坐标和 mvnrepository 网站 在 maven 中通过『坐标』概念来确定一个唯一确定的 jar 包。坐标的组成部分有&#xff1a; 元素说明<groupId>定义当前…

【C/C++】用return返回一个函数

2023年8月13日&#xff0c;周日早上 我的第一篇使用了动态图的博客 #include<iostream> #include<windows.h>int loop(){int i0;while(1){Sleep(1000);std::cout<<i<<std::endl;}return 1; }int main(){std::cout<<"程序开始"<<…