VS生成C++动态链接库DLL

1、官方文档:

在 Visual Studio 中创建 C/C++ DLL | Microsoft Learn

演练:创建和使用自己的动态链接库 (C++) | Microsoft Learn

创建和调用步骤,主要按照第二篇操作。

一、建立DLL项目生成库文件

直接建立C++的DLL项目,注意叙述:

如果“将解决方案和项目放在同一目录中”已选中,则取消选中。

这个不知道为什么。尝试选中也一样能最后生成.dll库文件,只不过目录不同。

VS生成DLL项目时,默认会生成一些头文件和源文件。文中,这些文件不用修改,只是需要再添加自己的头文件和源文件,在所有源文件中需要嵌入pch.h。

然后,需要非常注意的一点是:

在声明给外部的接口函数的头文件中,开头一段要写这一段代码:

#ifdef MATHLIBRARY_EXPORTS

#define MATHLIBRARY_API __declspec(dllexport)

#else

#define MATHLIBRARY_API __declspec(dllimport)

#endif

其中MATHLIBRARY_EXPORTS是这样来的:MATHLIBRARY是DLL工程名,后缀_EXPORTS表示要导出为库文件。这个名称,可以在建立了DLL项目后,在解决方案资源管理器中,右键工程--属性--配置属性--C/C++--预处理器--预处理器定义,选下拉,编辑,可以看到有这个后缀_EXPORTS的宏。

添加这段代码后,对于接口函数,需要在声明前面加上MATHLIBRARY_API这个宏,表示这些函数是库中对外的接口函数。

文中是:

extern "C" MATHLIBRARY_API void fibonacci_init(const unsigned long long a, const unsigned long long b);// Produce the next value in the sequence.
// Returns true on success and updates current value and index;
// false on overflow, leaves current value and index unchanged.
extern "C" MATHLIBRARY_API bool fibonacci_next();// Get the current value in the sequence.
extern "C" MATHLIBRARY_API unsigned long long fibonacci_current();// Get the position of the current value in the sequence.
extern "C" MATHLIBRARY_API unsigned fibonacci_index();

还在宏前加了extern "C"。

然后就可以编译了,VS中直接右键工程名点生成。如果是整个解决方案只有这个工程,也可以点击生成解决方案。需要注意的是,如果有修改,最好每次生成时选重新生成,而不是生成,或者先清理,在生成,试验发现直接点生成,只会生成.dll文件,而不会生成.lib文件。生成解决方案也是一样。

二、建立其他工程调用DLL库

按照参考文章设置各种路径,最好是新建工程,将库文件拷贝到新建工程中某个目录下,头文件也拷贝到某个目录下,需要在新建的工程中导入这些头文件。不建议文中建议的将目录都定位到原DLL工程的文件目录。这样关联性强但是也容易失掉版本。且是对于一个人来处理的。如果DLL给另一个人,则很难关联到原始的DLL工程。

编译,即生成项目或者解决方案,应该就可以用了。

2、其他文章:

VS开发C++动态库及其调用程序_把visual studio exe改成动态库-CSDN博客

实例代码在这:

【免费】C++动态库创建和应用程序调用动态库的源码_把visualstudioexe改成动态库资源-CSDN文库

这个例子很好,是正规的C++代码生成DLL库文件,纯手工写的。其中对类和函数的对外接口都有定义宏。

貌似下下来后直接编译的话,一些路径设置可能有些问题。

3、其他文章:

VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)_c++调用营销平台的sdk-CSDN博客

将下面代码中:

#ifdef DLL_CALCULATION
#define DLL_CALCULATION _declspec(dllexport)
#else
#define DLL_CALCULATION _declspec(dllimport)
#endif

第一个宏定义改为:DLL1_EXPORTS

这段代码的说明,本文中有解释。这是定义了一个对外接口的类。

其他,按照文中步骤执行,最终可以实现。

4、其他文章

vs studio生成dll并调用的实现示例_vs生成dll文件-CSDN博客

可以直接在pch.h文件中声明对外的接口函数(及变量、类型),而不需要再添加原来声明这些函数(及变量、类型)的头文件,


EXTERN_C _declspec(dllexport) int myAdd(int a, int b);
EXTERN_C _declspec(dllexport) int myMax(int a, int b);

注意声明前需要加一些预定义。

最后主函数文件,应该不需要嵌入Dll1.h。

没去试验了。应该没问题。

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

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

相关文章

Docker(八)高级网络配置

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 高级网络配置 注意:本章属于 Docker 高级配置,如果您是初学者,您可以暂时跳过本章节,直接学习…

飞天使-docker知识点13-查找docker run 启动时候命令与升级docker版本

文章目录 如果很久了&#xff0c;不记得之前docker run 命令然后在升级docker 版本 如果很久了&#xff0c;不记得之前docker run 命令 # 安装runlike安装包 pip install runlike# 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是…

低代码开发:数据处理与可视化

低代码开发是一种快速、高效的应用开发方法&#xff0c;它通过简化和自动化开发过程&#xff0c;使非专业开发人员也能快速构建数据处理和可视化应用。本文将介绍低代码开发的定义、优势&#xff0c;并以数据处理与可视化为例&#xff0c;探讨低代码开发在这一领域的应用和价值…

广东金牌电缆:法大大电子合同助力业务风险管控

广东金牌电缆集团股份有限公司&#xff08;以下简称“广东金牌电缆”&#xff09;成立于2013年&#xff0c;现为广东省电线电缆重点生产企业、广东省守合同重信用单位、国家专精特新小巨人企业、国家高新技术企业&#xff0c;拥有自主商标“夺冠”&#xff0c;“夺冠”商标被评…

Python 中多线程与多处理之间的区别

一、说明 在本文中&#xff0c;我们将学习 Python 中多线程和多处理的内容、原因和方式。在我们深入研究代码之前&#xff0c;让我们了解这些术语的含义。 二、基本术语和概念 程序是一个可执行文件&#xff0c;它由一组执行某些任务的指令组成&#xff0c;通常存储在计算机的…

IntelliJ IDEA 常用快捷键一览表(通用型,提高编写速度,类结构、查找和查看源码,替换与关闭,调整格式)

文章目录 IntelliJ IDEA 常用快捷键一览表1-IDEA的日常快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源码第5组&#xff1a;查找、替换…

第二课:BERT

文章目录 第二课&#xff1a;BERT1、学习总结&#xff1a;为什么要学习BERT&#xff1f;预训练模型的发展历程BERT结构BERT 输入BERT EmbeddingBERT 模型构建BERT self-attention 层BERT self-attention 输出层BERT feed-forward 层BERT 最后的Add&NormBERT EncoderBERT 输…

修复uni-simple-router@2.0.7版本query参数null的bug

问题&#xff1a;query参数为null或者为空时&#xff0c;插件内部参数校验问题导致的会报错&#xff1a;TypeError: Cannot convert undefined or null to object at Function.keys 源码修改如下&#xff1a; 通过打补丁的方式修复query参数类型校验问题 1. 安装patch-packag…

Python实现两个列表相加的方法汇总

1. 使用 “” 运算符 通过 “” 运算符将两个列表相加&#xff0c;得到一个新的列表。例如&#xff1a; list1 [1, 2, 3] list2 [4, 5, 6] result list1 list2 print(result) # [1, 2, 3, 4, 5, 6]2. 使用 extend 方法 使用 extend 方法将一个列表中的元素逐个添加到另…

【24.1.19】

24.1.19 本周工作内容下周工作计划 本周工作内容 本周的话主要的一个工作还是第三部分页面部分的完成工作&#xff0c;那就先来汇报一下第三部分的工作进度&#xff0c;第三部分的页面工作呢已经完成啦&#xff0c;就在刚刚提交啦全部的代码&#xff0c;那么这一部分的工作呢也…

使 a === 1 a === 2 a === 3 为 true 的几种“下毒“方法

前言 这算得上是近些年的前端网红题了&#xff0c;曾经对这种网红题非常抵触&#xff0c;认为非常没有意义。 看到了不少人有做分享&#xff0c;有各种各样的方案&#xff0c;有涉及到 JS 非常基础的知识点&#xff0c;也不得不感叹解题者的脑洞之大。 但是&#xff0c;拿来…

传奇服务器搭建

传奇服务器搭建 传奇是一款非常经典的游戏&#xff0c;自从它推出以来就深受玩家们的喜爱。如果你也想要在自己的服务器上搭建一个传奇&#xff0c;那么本文将为你提供一些有用的信息。 首先&#xff0c;我们需要知道什么是传奇服务器。简单来说&#xff0c;它就是一个能够让…

公司OA办公系统使用阿里云服务器怎么选配置?

公司OA、ERP等办公系统如何选择阿里云服务器配置&#xff1f;可以选择第七代企业级独享型云服务器&#xff0c;ECS通用型g7、计算型c7或内存型r7实例&#xff0c;4核CPU8G内存、8核16G、4核16G等配置&#xff0c;活动 https://t.aliyun.com/U/bLynLC 实例规格使用场景vCPU内存…

线程池c++实现

线程池c实现 概述 线程池&#xff08;Thread Pool&#xff09;是一种并发编程的设计模式&#xff0c;它用于管理和重复使用线程&#xff0c;以提高程序的性能和资源利用率。线程池通过维护一组预先创建的线程&#xff0c;这些线程可以在需要时被重复使用&#xff0c;而不是为…

HarmonyOS鸿蒙学习基础篇 - 什么是HarmonyOS

概述 HarmonyOS是华为开发的一款面向未来的全场景分布式智慧操作系统&#xff0c;将逐步覆盖18N全场景终端设备&#xff1b; 对消费者而言 HarmonyOS用一个‘统一的软件系统’ 从根本上解决消费者面对大量智能终端体验割裂的问题&#xff0c;为消费者带来同意便利安全的智慧化全…

相关系数(皮尔逊相关系数和斯皮尔曼相关系数)

本文借鉴了数学建模清风老师的课件与思路&#xff0c;可以点击查看链接查看清风老师视频讲解&#xff1a;5.1 对数据进行描述性统计以及皮尔逊相关系数的计算方法_哔哩哔哩_bilibili 注&#xff1a;直接先看 &#xff08; 三、两个相关系数系数的比较 &#xff09; 部分&#x…

C++17新特性(一)基本语言特性

1. 结构化绑定 假设你有两个不同成员的结构体&#xff1a; struct MyStruct {int i 0;std::string s; }; MyStruct ms;你可以通过如下声明直接把两个成员绑定到新的变量名&#xff1a; auto[u,v] ms;这种声明方式就称为结构化绑定。 下面这段代码演示了结构化绑定带来的好…

代码随想录算法训练营day24 || 回溯法原理讲解,77.组合

回溯方法的理论原理与定义 回溯算法是潜藏于递归过程之中一种操作&#xff0c;与递归操作相辅相成&#xff1b;初步理解&#xff0c;有递归必有回溯&#xff0c;使用回溯最好的方式是递归&#xff0c;至于其他的方式有待探索。回溯是一种多重循环的变体&#xff0c;其本质就是…

Qt事件过滤

1.相关说明 监控鼠标进入组件、出组件、点击组件、双击组件的事件&#xff0c;需要重写eventFilter函数 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&…

数据库(MySQL库表操作)

目录 1.1 SQL语句基础&#xff08;SQL命令&#xff09; 1.1.1 SQL的简介 1.1.2 SQL语句的分类 1.1.3 SQL语句的书写规范 1.2 数据库操作 1.2.1 查看 1.2.2 自建库 1.2.3 切换数据库 1.2.4 删库 1.3 MySQL字符集 1.3.1 MySQL字符集包括&#xff1a; 1.3.2 utf8 和 u…