当前位置: 首页 > news >正文

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.dtcms.com/a/313308.html

相关文章:

  • 其它IO函数
  • 在 ArkUI 中实现丝滑嵌套滚动:让你的页面像抖音一样顺滑
  • Redis——运维篇
  • 避不开的数据拷贝
  • 北斗变形监测技术应用与优势
  • 【AI云原生】1、Function Calling:大模型幻觉破解与Agent底层架构全指南(附Go+Python实战代码)》
  • 子区间问题
  • 差分 前缀和
  • 无人机集群协同三维路径规划,采用冠豪猪优化器(Crested Porcupine Optimizer, CPO)实现,Matlab代码
  • 【Django】-8- 视图和模型的关联
  • Linux下Redis常用命令
  • Java线程安全类设计思路总结
  • 深入理解Python的`__missing__`方法:动态处理字典中不存在的键: Effective Python 第18条
  • 网络规划与设计5个阶段内容
  • 大模型学习--第一天
  • Linux命令基础(上)
  • day 44 文件的规范书写与拆分
  • LCL滤波器及其电容电流前馈有源阻尼设计软件【LCLAD_designer】
  • 机器学习——决策树(DecisionTree)
  • 分享两个问题及其解决方法:发送AT没反应和wifi模块连接不上热点
  • Java设计模式之行为型模式(访问者模式)应用场景分析
  • MATLAB小波分析工具包进行时间序列的小波功率谱分析
  • 基于Matlab的深度学习智能行人检测与统计系统
  • FastAPI入门:安全性
  • 网安-逻辑漏洞-23登陆验证
  • 【系统编程】错误处理、读写缓冲区及位图
  • 文章分享---《Keil 再升级,修复了这些bug》
  • [自动化Adapt] 录制引擎
  • Nginx 相关实验(1)
  • C语言数据结构(7)贪吃蛇项目2.贪吃蛇项目实现