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

news2024/11/26 4:31:51

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

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

相关文章

小程序商城 免 费 搭 建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 使用技术: Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台: 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务(30个通用…

Datawhale 强化学习笔记(二)马尔可夫过程,DQN 算法

文章目录 参考马尔可夫过程DQN 算法(Deep Q-Network)如何用神经网络来近似 Q 函数如何用梯度下降的方式更新网络参数强化学习 vs 深度学习 提高训练稳定性的技巧经验回放目标网络 代码实战 DQN 算法进阶Double DQNDueling DQN 算法代码实战 参考 在线阅…

【印象深刻的实战经历】两次全国大学生数学建模经历分享

目录 🌼初次接触 初次参加培训 分享培训所得 比赛开始 🔥再次接触 参加校赛 机缘巧合 再次培训 比赛开始 📕技巧总结 从问题的实际意义分析大体上可分为 从问题的解决方法上分析 做国赛题目的步骤 赛前准备 选题 寻找思路…

蓝桥杯每日一题----货物摆放

题目 分析 上来一看,三个for循环,从1到n,寻找满足lwhn的个数,但是这样根本跑不出来答案,n太大了,1e15的级别,O(n)的时间复杂度都不行,更何况是O(…

Docker(一)简介和基本概念

一、简介 本章将带领你进入 Docker 的世界。 什么是 Docker? 用它会带来什么样的好处? 好吧,让我们带着问题开始这神奇之旅。 1.什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目&…

Jenkins的环境部署,(打包、发布、部署、自动化测试)

一、Tomcat环境安装 1.安装JDK(Java环境) JDK下载地址:Java Downloads | Oracle 安装好后在系统环境变量里配置环境变量: ①添加JAVA_HOME 变量名:JAVA_HOME变量值:C:\Program Files\Java\jdk1.8.0_18…

docker安装运行CloudBeaver并设置默认语言为中文

1、CloudBeaver CloudBeaver 是一个开源的 Web 数据库管理工具,它提供了一个基于浏览器的用户界面,允许用户管理和操作各种类型的数据库。CloudBeaver 支持多种数据库系统,包括但不限于 PostgreSQL、MySQL、SQLite、Oracle、SQL Server 以及…

ClickHouse学习笔记(六):ClickHouse物化视图使用

文章目录 1、ClickHouse 物化视图2、物化视图 vs 普通视图3、物化视图的优缺点4、物化视图的用法4.1、基本语法4.2、准备表结构4.3、准备数据4.4、查询结果 1、ClickHouse 物化视图 ClickHouse 的物化视图是一种查询结果的持久化,它的存在是为了带来查询效率的提升…

银河麒麟服务器操作系统搭建证书服务器并颁发可用于签名的证书步骤说明

银河麒麟服务器操作系统搭建证书服务器并颁发可用于签名的证书的方法与前面Centos7上(centos7 使用openssl 配置证书服务器并颁发证书(史上最详细版本)_centos phpinfo显示的openssl配置项为/etc/pki/tls/openssl.c-CSDN博客)是一…

N-140基于springboot,vue协同过滤推荐算法个性化购物商城

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatisredis 本…

Chondrex:Glycosaminoglycans Assay Kit(糖胺聚糖检测试剂盒)

糖胺聚糖(glycosaminoglycans,GAGs)是一种携带负电荷的多糖链,位于大多数结缔组织和许多不同类型细胞的细胞外基质(extracellular matrices, ECM)中以及细胞表面上。由重复双糖单位复合构成的糖胺聚糖可分为…

Kali在Vmware无法连接到网络,配置网络及解决办法

一.问题描述: 打开 Kali,无法连接到网络,虚拟机配置正常的。 尝试 ping 百度,出错: ping baidu.com 提示: ping: baidu.com: Temporary failure in name resolution二.解决办法: 1.首先在vmwa…

FaFu--练习复盘--1

1、输出图形及二维数组应用 1.1.输出图形 描述 编写程序打印n行如下图形&#xff0c;其中1≤n≤500。 输入用例 7 输出用例 具体实现 #include"stdio.h" int main(){int n,i,j;scanf("%d",&n);for(i 1; i< n;…

盘点 Top 10 最好用的开发者工具箱

He3 有 500 工具&#xff0c;支持自定义工具分类&#xff0c;可以在线使用也可以下载客户端到本地&#xff0c;但有部分工具只能下载客户端才能使用&#xff0c;AI 工具需要升级购买积分&#xff0c;页面简洁&#xff0c;没有广告&#xff0c;部分小工具开源&#xff1b;JSON和…

Python vs. Rust:打破三大障碍

在我周围的每个人都知道我是Python 的忠实粉丝。大约15年前&#xff0c;当我对 Mathworks Matlab 感到厌倦时&#xff0c;我开始使用Python。虽然Matlab的理念看起来不错&#xff0c;但在掌握了Python之后&#xff0c;我再也没有回头。我甚至成为了我所在大学的Python传道者&am…

结构体内存对齐的跨平台做法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 之前写了一篇文章&#xff1a;使用标准C库读文件时需要注意的一个问题&#xff0c;今天发现是错误的。正确的做法是使用#pragma pack预处理指令。示例程序…

idea社区版 MybatisCodeHelperPro插件使用介绍

文章目录 一、插件介绍二、idea社区版安装MybatisCodeHelperPro插件三、问题记录1. DatabaseHelper插件 加载不了部分数据库链接的列信息2. DatabaseHelper插件 数据库列显示顺序错乱3. MybatisCodeHelperPro插件 数据库字段不提示4. MybatisCodeHelperPro插件 特殊字段增加反引…

【北亚企安数据恢复】RAIDZ多块磁盘离线导致服务器崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; ORACLE SUN ZFS某型号存储&#xff0c;共40块磁盘组建存储池&#xff0c;其中的36块磁盘分为三组&#xff0c;每组12块&#xff0c;单个组使用ZFS特有的RAIDZ管理所有磁盘&#xff0c;RAIDZ级别为2&#xff1b;另外的4块磁盘作为全局热备。存储…

高效解决在本地计算机运行ubuntu服务器端的jupyter lab

文章目录 问题解决方案step1step2step3step4 问题 目前&#xff0c;网上没有什么详细的关于在本地计算机上运行服务器端jupyter lab的教程&#xff0c;由于个人计算机计算资源有限&#xff0c;我们需要利用服务器端的GPU实现高效训练 这篇文章将指导您如何使用 ssh 隧道在远…

Python学习从0到1 day4 python基础语法2 格式化输出和输入方法

其实我不是我&#xff0c;我是青山辽阔 ——24.1.14 一、百分号形式的格式化输出 1.普通输出 #1.定义一些变量 name 陈浩南 age 25 address 广州市天河区#2.变量的输出&#xff08;普通输出&#xff09; print(name) print(age) print(address)#3.Python中&#xff0c;还允…