C++ 生成动态库.dll 及 C++调用DLL,C++ 生成静态库.lib及 C++调用lib

文章目录

  • 1 C++ 动态库.dll生成 及 调用
    • 1.1 生成C++ 动态库dll
      • 1.1.1 创建项目MyDLL
      • 1.1.2 编写.h 和 .cpp文件
      • 1.1.3 设置 及 生成 DLL
    • 1.2 调用 C++ 动态库dll
      • 1.2.1 创建C++ 空项目DLLtest
      • 1.2.2 动态库配置 及代码调用测试
  • 2 C++ 静态库.lib 生成 及 调用
  • 3 C++ 生成静态库.lib及调用 (纯图教程)
    • 3.1 C++ 生成lib
    • 3.2 C++ 调用 lib
  • 4 C++ 动态库.dll生成 及 调用 (纯图教程)
    • 4.1 C++生成DLL
    • 4.2 C++调用DLL

1 C++ 动态库.dll生成 及 调用

1.1 生成C++ 动态库dll

为了验证效果,使用三种方法导出函数:

  • //导出函数
  • //导出类
  • //以C方式导出函数
创建动态库d11:1.VS创建C++ 空项目MyDLL:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成dll文件:右键项目-->属性-->配置类型-->动态库( .dll)以Debug x64 生成解决方案

1.1.1 创建项目MyDLL

1.VS创建C++ 空项目MyDLL:

(也可以创建动态链接库,但不影响,都可以使用)
在这里插入图片描述
在这里插入图片描述

1.1.2 编写.h 和 .cpp文件

添加 mathTest.hmathTest.cpp文件
在这里插入图片描述
mathTest.h 文件

#pragma once
#ifndef MATHTEST_H
#define MATHTEST_H//宏定义导出:
#ifndef MATHTEST_ //如果没有定义 MATHTEST_,就定义MATHTEST_API __declspec(dllexport)
#define MATHTEST_API __declspec(dllexport) //导出
#else
#define MATHTEST_API __declspec(dllimport) //导入
#endif//导出函数
MATHTEST_API int add(int a, int b);//加法
MATHTEST_API int subtract(int a, int b);//减法//导出类
class MATHTEST_API mathTest
{public:int multiply(int a, int b);//乘法int divide(int a, int b);//除法
};//以C方式导出函数
//extern "C",告诉编译器这里是C语言代码//为了使自己建的库可以在 C/C++ 通用调用,使用 __cplusplus ,
//当C++调用代码时,__cplusplus 值为1,声明函数外面就加了一层“extern "C" {}”;
//当C 调用代码时,__cplusplus 值为0,就相当于没有“extern "C" {}”;#ifdef __cplusplus 
extern "C"
{
#endifMATHTEST_API int Cadd(int a, int b);//加法MATHTEST_API int Csubtract(int a, int b);//减法
#ifdef __cplusplus
}
#endif#endif

mathTest.cpp文件

#include "mathTest.h"/*创建动态库d11:1.VS创建C++ 空项目MyDLL:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成dll文件:右键项目-->属性-->配置类型-->动态库( .dll)以Debug x64 生成解决方案
*///导出函数
int add(int a, int b)//加法
{return a + b;
}
int subtract(int a, int b)//减法
{return a - b;
}//导出类
int mathTest::multiply(int a, int b)//乘法
{return a * b;
}int mathTest::divide(int a, int b)//除法
{return a / b;
}//以C方式导出函数
int Cadd(int a, int b)//加法
{return a + b;
}int Csubtract(int a, int b)//减法
{return a - b;
}

1.1.3 设置 及 生成 DLL

右键项目–>属性–>配置类型–>动态库( .dll)
在这里插入图片描述
右键项目–>生成 (如修改后,可以点重新生成)
在这里插入图片描述

在这里插入图片描述
查看 生成的DLL文件
在这里插入图片描述
查看DLL
在这里插入图片描述
注意是.D:\Projects\C#\MyDLL\x64\Debug,在工程同级目录下\x64\Debug下面

而不是 D:\Projects\C#\MyDLL\MyDLL\x64\Debug,而不是在.h同级目录的\x64\Debug下面(刚开始就在这里找,发现MyDLL.dll.recipe多了一个.recipe,迷糊了半天

在这里插入图片描述

1.2 调用 C++ 动态库dll

方法:

创建C++ 空项目DLLtest使用动态库d11:隐式调用:1..lib(MyDLL.lib).dll(MyDLL.d11).h(mathTest.h)文件放到工程目录下(DLLtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyDLL.lib3.#include mathTest.h4.代码调用

1.2.1 创建C++ 空项目DLLtest

创建C++ 空项目DLLtest

(也可以创建在MyDLL解决方案同一目录下)
在这里插入图片描述
在这里插入图片描述

1.2.2 动态库配置 及代码调用测试

使用动态库d11:
隐式调用:

使用动态库d11:隐式调用:1..lib(MyDLL.lib).dll(MyDLL.dll).h(mathTest.h)文件放到工程目录下(DLLtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyDLL.lib3.#include mathTest.h4.代码调用

完整代码

#include<iostream>
#include"mathTest.h"
using namespace std;/*
VS创建C++ 空项目DLLtest使用动态库d11:隐式调用:1.把.lib(MyDLL.lib)、.d11(MyDLL.d11)、.h(mathTest.h)文件放到工程目录下(DLLtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyDLL.1b3.#include mathTest.h4.代码调用
*/int main()
{//调用dll导出的函数int sum = add(10, 5);int sub = subtract(10, 5);//调用dll导出的类成员函数mathTest mathT; //实例化对象int mul = mathT.multiply(10, 5);int div = mathT.divide(10, 5);//调用以C方式导出的函数int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);cout << "我的动态库dll调用: "<< endl;cout << "add(10,5) = " << sum << endl<< "subtract(10,5) = " << sub << endl<< "multiply(10,5) = " << mul << endl<< "divide(10,5) = " << div << endl<< "Cadd(10,5) = " << Csum << endl<< "Csubtract(10,5) = " << Csub << endl;return 0;
}

运行测试
在这里插入图片描述

2 C++ 静态库.lib 生成 及 调用

C++ 静态库.lib 生成C++ 动态库.dll生成方法基本一样

不同的就是 配置类型-->动态库( .dll) 改为 配置类型-->静态库(.lib)

  • 创建静态库lib
创建静态库lib:1.VS创建C++ 空项目MyLIB:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成1ib文件:右键项目-->属性-->配置类型-->静态库(.lib)以Debug x64 生成解决方案
  • 使用静态库lib
VS创建C++ 空项目LIBtest使用静态库lib:隐式调用:1..lib(MyLIB.lib).h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib3.#include mathTest.h4.代码调用

下面是关键截图
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
mathTest.h

#pragma once
#ifndef MATHTEST_H
#define MATHTEST_H//宏定义导出:
#ifndef MATHTEST_ //如果没有定义 MATHTEST_,就定义MATHTEST_API __declspec(dllexport)
#define MATHTEST_API __declspec(dllexport) //导出
#else
#define MATHTEST_API __declspec(dllimport) //导入
#endif//导出函数
MATHTEST_API int add(int a, int b);//加法
MATHTEST_API int subtract(int a, int b);//减法//导出类
class MATHTEST_API mathTest
{public:int multiply(int a, int b);//乘法int divide(int a, int b);//除法
};//以C方式导出函数
//extern "C",告诉编译器这里是C语言代码//为了使自己建的库可以在 C/C++ 通用调用,使用 __cplusplus ,
//当C++调用代码时,__cplusplus 值为1,声明函数外面就加了一层“extern "C" {}”;
//当C 调用代码时,__cplusplus 值为0,就相当于没有“extern "C" {}”;#ifdef __cplusplus 
extern "C"
{
#endifMATHTEST_API int Cadd(int a, int b);//加法MATHTEST_API int Csubtract(int a, int b);//减法
#ifdef __cplusplus
}
#endif#endif

mathTest.cpp

#include "mathTest.h"/*创建静态库lib:1.VS创建C++ 空项目MyLIB:编写.h和.cpp文件在.h文件中宏定义导出图数2.生成1ib文件:右键项目-->属性-->配置类型-->静态库(.lib)以Debug x64 生成解决方案
*///导出函数
int add(int a, int b)//加法
{return a + b;
}
int subtract(int a, int b)//减法
{return a - b;
}//导出类
int mathTest::multiply(int a, int b)//乘法
{return a * b;
}int mathTest::divide(int a, int b)//除法
{return a / b;
}//以C方式导出函数
//extern "C",告诉编译器这里是C语言代码
int Cadd(int a, int b)//加法
{return a + b;
}int Csubtract(int a, int b)//减法
{return a - b;
}

使用静态库lib:

#include<iostream>
#include"mathTest.h"
using namespace std;/*
VS创建C++ 空项目LIBtest使用静态库lib:隐式调用:1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)2.项目右键-- > 属性-->配置属性-->链接器-->输入->附加依项-- > 添加MyLIB.lib3.#include mathTest.h4.代码调用
*/int main()
{//调用dll导出的函数int sum = add(10, 5);int sub = subtract(10, 5);//调用dll导出的类成员函数mathTest mathT; //实例化对象int mul = mathT.multiply(10, 5);int div = mathT.divide(10, 5);//调用以C方式导出的函数int Csum = Cadd(10, 5);int Csub = Csubtract(10, 5);cout << "我的静态库.lib调用: " << endl;cout << "add(10,5) = " << sum << endl<< "subtract(10,5) = " << sub << endl<< "multiply(10,5) = " << mul << endl<< "divide(10,5) = " << div << endl<< "Cadd(10,5) = " << Csum << endl<< "Csubtract(10,5) = " << Csub << endl;return 0;
}

3 C++ 生成静态库.lib及调用 (纯图教程)

3.1 C++ 生成lib

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.2 C++ 调用 lib

在这里插入图片描述

4 C++ 动态库.dll生成 及 调用 (纯图教程)

4.1 C++生成DLL

在这里插入图片描述

在这里插入图片描述

4.2 C++调用DLL

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

信创应用服务器TongWeb安装教程、前后端分离应用部署全流程

TongWeb 简介TongWeb 是东方通&#xff08;TongTech&#xff09;开发的国产Java应用服务器&#xff08;中间件&#xff09;&#xff0c;类似于国外的 WebLogic、WebSphere 和开源的 Tomcat、Jetty&#xff0c;主要用于企业级Java应用&#xff08;如J2EE&#xff09;的部署和运行…

Rust 同步方式访问 REST API 的完整指南

Rust 同步方式访问 REST API 的完整指南 在 Rust 中不使用异步机制访问 REST API 是完全可行的&#xff0c;特别适合简单应用、脚本或不需要高并发的场景。以下是完整的同步实现方案&#xff1a; &#x1f4e6; 依赖选择 推荐库&#xff1a; [dependencies] reqwest { version…

32.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--财务服务--账本与预算

在我们的孢子记账应用中&#xff0c;账本是用于记录每一笔收支流水的核心模块。通过账本&#xff0c;我们可以清晰地追踪资金的流入与流出&#xff0c;进行数据统计和分析&#xff0c;为后续的报表生成和决策支持提供基础数据。预算模块则是用于设置和管理预算的功能&#xff0…

模型预估打分对运筹跟踪的影响

在uplift建模中&#xff0c;模型离线指标(QINI、AUUC)提升并不意味着在线A/B实验的收益&#xff0c;因为在线运筹还需要λ\lambdaλ约束。如果模型打分不满足单调增且roi边际递减&#xff0c;那么λ\lambdaλ运筹求解会非常不稳定&#xff0c;导致线上发券偏高&#xff0c;毛利…

音视频学习(四十六):声音的三要素

声音是人类感知世界的重要途径之一。在自然界中&#xff0c;声波本质上是介质中传播的机械振动&#xff0c;而人类对声音的主观感受主要通过三种属性来认知和描述&#xff0c;即音调&#xff08;音高&#xff09;、响度&#xff08;强弱&#xff09;、音色&#xff08;音质&…

spring batch处理数据模板(Reader-Processor-Writer模式)

步骤监听器 Component public class StepListener implements StepExecutionListener {private StepExecution stepExecution;public StepExecution getStepExecution() {return this.stepExecution;}Overridepublic void beforeStep(StepExecution stepExecution) {this.stepE…

【华为OD机试】从小桶里取球

题目描述 某部门开展Family Day开放日活动,其中有个从桶里取球的游戏,游戏规则如下: 有N个容量一样的小桶等距排开,且每个小桶都默认装了数不等的小球, 每个小桶装的小球数量记录在数组bucketBallNums中, 游戏开始时,要求所有桶的小球总数不能超过SUM, 如果小球总…

std::unordered_map 和 std::map的区别【C++】

std::unordered_map 和 std::map 是 C 标准库中两种不同的关联容器&#xff0c;它们都用于存储键值对&#xff0c;但在实现方式、性能特点和使用场景上存在显著区别。以下是它们的主要区别&#xff1a; 1. 数据结构 std::map&#xff1a; 基于 红黑树&#xff08;一种自平衡二叉…

云原生环境里的显示变革:Docker虚拟浏览器与cpolar穿透技术实战

文章目录前言【视频教程】1. 关于neko2. 本地部署neko3. neko简单使用4. 安装内网穿透5. 配置neko公网地址6. 配置固定公网地址前言 现代远程协作本该是无缝衔接的过程&#xff0c;却被这些障碍不断打断&#xff1a;多设备屏幕同步存在延迟、跨平台访问需要复杂配置、公网IP申…

LVGL + ESP-Brookesia 在Windows下的编译和运行

LVGL ESP-Brookesia 在Windows下的编译和运行 1. 项目介绍 本项目是基于 LVGL&#xff08;轻量级多功能图形库&#xff09;和 ESP-Brookesia 的嵌入式模拟桌面应用开发框架&#xff0c;专为嵌入式设备构建丰富的图形界面而设计。通过在Windows环境下模拟嵌入式设备的图形界面…

【ip】IP地址能否直接填写255?

IP地址数值限制​ 最近有朋友后台问我&#xff0c;IP地址里填255行不行&#xff1f;思索着有一阵子没有分享基础的知识&#xff0c;就在今天大致说一下&#xff0c;关于IP地址里填255行不行&#xff1f;答案当然是否定的。 IP地址由4个段组成&#xff0c;每个段的数值范围其实限…

力扣热题100----------141.环形链表

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索…

【Java开发日记】我们来说说 LockSupport 的 park 和 unpark

目录 一、LockSupport 1.1、LockSupport函数列表 1.2、基本使用 先 park 再 unpark 先 unpark 再 park 1.3、特点 与 Object 的 wait & notify 相比 二、LockSupport park & unpark原理 2.1、情况一&#xff0c;先调用park&#xff0c;再调用unpark park 操作…

AGI|从“实验室”到“生产线”:企业级AI Agent 如何突围

在数字化转型的深水区&#xff0c;企业级 AI Agent 正从技术概念走向产业实践&#xff0c;成为驱动生产力变革的核心引擎。目录 一、风口已至&#xff1a;AI Agent 的崛起逻辑与市场刚需 二、企业级AI Agent&#xff1a;核心能力与独特价值定位 三、AI Agent 的未来目标 一、…

AtCoder Beginner Contest 417

文章目录A A SubstringB Search and DeleteC Distance IndicatorsD Takahashis ExpectationE A Path in A DictionaryF Random GatheringG Binary CatAtCoder Beginner Contest 417A A Substring You are given an N-character string S consisting of lowercase English lett…

C++23 Concepts:用类型约束重构泛型编程的终极方案

一、开篇:模板元编程的"类型检查困局" 某金融量化团队曾遇到诡异bug: template<typename T> void process(T data) {static_assert(std::is_arithmetic<T>::value, "需要数值类型");// 业务逻辑... } 当调用process("hello")时…

【RK3568 看门狗驱动开发详解】

RK3568 看门狗驱动开发详解一、Linux 看门狗子系统架构​二、设备树配置​三、 看门狗驱动实现四、验证看门狗定时器&#xff08;Watchdog Timer&#xff09;是保障嵌入式系统可靠性的关键硬件&#xff0c;它通过定期接收 “喂狗” 信号监控系统运行状态&#xff0c;当系统故障…

探索 Vue 3.6 新特性:Vapor Mode 与高性能 Web 应用开发

Vue 3.6 简介 Vue.js 是一个广受欢迎的渐进式 JavaScript 框架&#xff0c;以其简洁的 API、灵活的组件系统和高性能著称。Vue 3.6 是 Vue 3 系列的一个重要版本&#xff0c;引入了多项性能优化和新特性&#xff0c;尤其是备受关注的 Vapor Mode&#xff0c;这是一个无需虚拟 D…

初识prometheus

Prometheus&#xff1a;云原生时代的监控利器 在当今快速发展的云原生和微服务架构时代&#xff0c;传统的监控系统面临着巨大的挑战&#xff1a;如何高效地收集海量、动态变化的指标&#xff1f;如何实时告警并快速定位问题&#xff1f;如何实现灵活的可视化和强大的数据查询…

从源码角度分析导致 JVM 内存泄露的 ThreadLocal

文章目录1. 为什么需要ThreadLocal2. ThreadLocal的实现解析1.1 实现分析1.2 具体实现1.3 ThreadLocalMap中Hash冲突的解决1.3.1 Hash冲突解决的几种方法1.3.1.1 开放定值法1.3.1.2 链地址法1.3.1.3再哈希法&#xff1a;1.3.1.4 建立公共溢出区1.3.2 ThreadLocal解决Hash冲突的…