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

【09】C++实战篇——C++ 生成静态库.lib 及 C++调用lib,及实际项目中的使用技巧

文章目录

  • 1 C++ 静态库.lib 生成
    • 1.1 静态库lib的生成方法和使用方法
    • 1.2 创建静态库项目
    • 1.3 编写.h 和 .cpp文件
    • 1.4 设置 及 生成 DLL
  • 2 调用 C++ 静态库lib
    • 2.1 新建LIBtest及测试代码
    • 2.2 静态库配置 及代码调用测试
  • 3 实际项目中的使用技巧、及通用设置
    • 3.1 设置lib输出路径
    • 3.2 设置头文件引入路径
    • 3.3 改进后 测试
  • 4 完整代码.h文件、.cpp 文件
  • 5 完整项目文件下载

1 C++ 静态库.lib 生成

C++ 静态库.lib 生成C++ 动态库.dll生成方法基本一样,【08】C++实战篇——C++ 生成动态库.dll 及 C++调用DLL,及实际项目中的使用技巧

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

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

  • //导出函数
  • //导出类
  • //以C方式导出函数

1.1 静态库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.代码调用

1.2 创建静态库项目

1.VS创建C++ 空项目MyLIB
在这里插入图片描述

1.3 编写.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"/*创建静态库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;
}

1.4 设置 及 生成 DLL

右键项目–>属性–>配置类型–>静态库( .lib)
在这里插入图片描述

右键项目–>生成 (如修改后,可以点重新生成)

成功:
在这里插入图片描述
查看 生成的lib文件
在这里插入图片描述

2 调用 C++ 静态库lib

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

2.1 新建LIBtest及测试代码

右键“解决方案MyLIB”,新建C++ 空项目LIBtest
在这里插入图片描述
在这里插入图片描述

在项目中添加main.cpp文件,及代码
在这里插入图片描述

#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;
}

2.2 静态库配置 及代码调用测试

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

在这里插入图片描述

项目右键-- > 属性–>配置属性–>链接器–>输入->附加依项-- > 添加MyLIB.lib
在这里插入图片描述

在这里插入图片描述

LIBtest“设为启动项”

方法参考下图
在这里插入图片描述
调用测试成功,

导出函数、导出类成员函数、以C方式导出的函数,现在这三种函数都用结果都输出了,说明这三种dll导出函数方式都有,但我们最常用的是 以C方式导出的函 ,这中通用个,避免出错。
在这里插入图片描述

3 实际项目中的使用技巧、及通用设置

(lib、.h复制到 测试项目的.cpp目录下,太麻烦),下面使用自动路径

删掉LIBtest目录下上一次的操作文件 1.把.lib(MyLIB.lib)、.h(mathTest.h)文件放到工程目录下(LIBtest项目的.cpp同目录下)

3.1 设置lib输出路径

直接将lib生成文件,的生路径设为 “LIBtest”项目下的.cpp路径;

为了是的路径通用,这里使用相对路径 ../LIBtest/

在这里插入图片描述

并且将 MyLIB 设为启动项,设置后需要重新生成lib。

可见新的dll文件已经 生成在LIBtest项目下面了

在这里插入图片描述

在这里插入图片描述

3.2 设置头文件引入路径

将LIBtest设为启动项;
设置LIBtest项目的 附加包含目录为 ../MyLIB/这样LIBtest项目就可以访问 mathTest.h 文件了。

在这里插入图片描述

3.3 改进后 测试

再次测试 OK

在这里插入图片描述

注意:既然新的dll生成路径已经更改到 “LIBtest”项目下的.cpp路径,那么第一次在 MyLIB\x64\Debug\路径下生成的生成的lib最好删掉,

不然两个路径同时存在lib,调用时会产生混淆,当两个路径下的lib代码源文件完全一样时,似乎并没有影响。一旦新的lib代码修改了,这时两个路径下lib内容不一致,调用运行时就会出错。

所以下面路径的3文件删掉。
在这里插入图片描述

4 完整代码.h文件、.cpp 文件

为了统一规范,同时使用“以C语言的方式导出函数”

导出函数、导出类成员函数、以C方式导出的函数,现在这三种函数都用结果都输出了,说明这三种dll导出函数方式都有,但我们最常用的是 以C方式导出的函 ,这种通用个,避免出错。

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//以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);//减法MATHTEST_API int Cmultiply(int a, int b); //乘法MATHTEST_API int Cdivide(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 生成解决方案
*///以C方式导出函数int Cadd(int a, int b)//加法
{return a + b;
}
int Csubtract(int a, int b)//减法
{return a - b;
}int Cmultiply(int a, int b)//乘法
{return a * b;
}int Cdivide(int a, int b)//除法
{return a / b;
}

5 完整项目文件下载

完整项目工程文件,下载后可直接编译运行
在这里插入图片描述

在这里插入图片描述

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

http://www.lryc.cn/news/609480.html

相关文章:

  • vue3指定设置了dom元素的ref但是为null问题
  • 大模型 与 自驾 具身 3D世界模型等相关知识
  • 华为OD机考2025C卷 - 最小矩阵宽度(Java Python JS C++ C )
  • vim 组件 使用pysocket进行sock连接
  • 408数据结构排序部分知识的复盘:从原理到辨析的系统化梳理
  • 抗辐照DCDC与MCU在核环境监测设备中的集成应用
  • 远程测控终端RTU:工业物联的“神经末梢”与远程操控核心
  • CVPR论文解析:告别Janus问题,text-to-3D更一致!
  • 5G专网与SD-WAN技术融合:某饮料智能工厂网络架构深度解析
  • Planner 5D v2.29.0 安卓高级解锁版,手机3D家装,全套家具免费
  • 【基于WAF的Web安全测试:绕过Cloudflare/Aliyun防护策略】
  • iOS混淆工具有哪些?功能测试与质量保障兼顾的混淆策略
  • SpringBoot3.x入门到精通系列:3.2 整合 RabbitMQ 详解
  • mac 锁屏不断网 2025
  • Java基础-斗地主游戏
  • 亚马逊撤离Google购物广告:重构流量生态的战略博弈
  • 编译 Paddle 遇到 flashattnv3 段错误问题解决
  • 37. line-height: 1.2 与 line-height: 120% 的区别
  • YAML文件
  • Vue Router快速入门
  • 高精度实战:YOLOv11交叉口目标行为全透视——轨迹追踪×热力图×滞留分析(附完整代码)
  • 深度学习TR3周:Pytorch复现Transformer
  • 第三阶段—8天Python从入门到精通【itheima】-143节(pyspark实战——数据计算——flatmap方法)
  • 大型语言模型落地应用全景指南:微调、提示工程、多模态与企业级解决方案
  • Perl 面向对象编程深入解析
  • 如何计算卷积层的计算量?从参数到公式的详细推导
  • PPT自动化 python-pptx - 11 : 备注页 (Notes Slides)
  • JUCE VST AI 开源
  • 进程生命周期管理:从创建到终止的完整逻辑
  • 解锁高并发LLM推理:动态批处理、令牌流和使用vLLM的KV缓存秘密