C++ 把类封装成静态链接库

目录

一、动态链接库和静态链接库的区别

二、对比

1、静态链接库 (Static Library)

2、动态链接库 (Dynamic Library)

三、制作步骤

1. 创建类头文件

2. 实现类

3. 创建静态链接库工程

4. 构建静态链接库

5. 使用静态链接库

6、添加静态库和头文件路径


一、动态链接库和静态链接库的区别

静态链接库(Static Library)和动态链接库(Dynamic Library)是两种不同的代码复用和模块化方法。它们在构建、链接、分发和使用方面有许多重要的区别。

二、对比

1、静态链接库 (Static Library)

  1. 文件扩展名:在Windows中通常是.lib,在Linux中是.a
  2. 链接时间:在编译时将库代码复制到每个使用它的可执行文件中。
  3. 运行时依赖:不需要在运行时提供库文件,因为库代码已经包含在可执行文件中。
  4. 文件大小:由于每个可执行文件都包含库代码,所以生成的可执行文件较大。
  5. 版本控制:更容易控制和测试,因为库代码在编译时已经确定,不会在运行时改变。

2、动态链接库 (Dynamic Library)

  1. 文件扩展名:在Windows中通常是.dll,在Linux中是.so
  2. 链接时间:在编译时生成对库的引用,而不复制库代码。实际的库代码在运行时加载。
  3. 运行时依赖:需要在运行时提供库文件。
  4. 文件大小:由于库代码不包含在可执行文件中,所以生成的可执行文件较小。
  5. 版本控制:库文件可以独立更新,多个可执行文件可以共享同一个库文件。

三、制作步骤

将一个C++类定义成静态链接库(Static Library),与动态链接库(DLL)的步骤类似,但有一些不同。

1. 创建类头文件

定义你要封装的类。例如,创建一个名为MyClass的类:

// MyClass.h
#pragma onceclass MyClass {
public:MyClass();~MyClass();void SayHello();
};

2. 实现类

实现这个类的方法:

// MyClass.cpp
#include "MyClass.h"
#include <iostream>MyClass::MyClass() {}MyClass::~MyClass() {}void MyClass::SayHello() {std::cout << "Hello from MyClass!" << std::endl;
}

3. 创建静态链接库工程

在 Visual Studio 中创建一个新的静态链接库工程:

  1. 打开 Visual Studio,创建一个新的项目。
  2. 选择 Static Library (LIB) 项目类型。
  3. 添加 MyClass.hMyClass.cpp 文件到项目中。

4. 构建静态链接库

构建工程,将会生成一个 .lib 文件(例如 MyLibrary.lib)。

5. 使用静态链接库

要使用这个静态链接库,需要在另一个项目中导入它:

// main.cpp
#include <iostream>
#include "MyClass.h"int main() {MyClass myClass;myClass.SayHello();return 0;
}

在你的新项目中,确保以下几点:

  1. 将生成的 MyLibrary.lib 文件添加到新项目的链接器输入中。
  2. 确保 MyClass.h 头文件在新项目的包含路径中。

6、添加静态库和头文件路径

在新项目中配置静态库和头文件路径:

  1. 右键点击新项目,选择“属性”。
  2. 在左侧面板中选择“C/C++” -> “常规”。
  3. 在“附加包含目录”中添加静态库的头文件路径。
  4. 在左侧面板中选择“链接器” -> “常规”。
  5. 在“附加库目录”中添加静态库文件的路径。
  6. 在左侧面板中选择“链接器” -> “输入”。
  7. 在“附加依赖项”中添加静态库文件名(例如 MyLibrary.lib)。

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

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

相关文章

SpringCloud_Ribbon负载均衡

概述 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 源码 LoadBalancerInterceptor 其中含有intercept方法&#xff0c;拦截用户的HttpRequest请求&#xff1a; request.getURI() 获取请求uri&#xff0c;即http://userservice/use…

3D Gaussian Splatting代码中的Gaussian_Module和Cameras两个类的代码解读

Gaussian_model 讨论Gaussian_model这个类&#xff0c;是因为里面包含了三维高斯分布的基本信息&#xff0c;里面定义了各种参量的构建方式、用于优化学习的激活函数、学习率设置方法和高斯点优化过程中的增加与删除方式及对应优化器的处理方法。这个类定义在scene文件夹中的g…

反激开关电源反馈电路相关参数选型

Vb的电压正常变化范围是&#xff1a;0-1V&#xff08;最低0V&#xff0c;由于有稳压管&#xff0c;最高不会超过1V&#xff09; Vb的电压越高&#xff0c;则输出占空比越大&#xff0c;Vb电压越低&#xff0c;则输出占空比越小 那么Va的正常变化范围应该是&#xff1a;1.4-4.…

怎么配置electron-builder

electron-builder 是一个用于 Electron 应用程序打包和发布的工具,它支持 macOS、Windows 和 Linux 平台。以下是一个清晰且详细的 electron-builder 配置指南,包括分点表示和归纳,并参考了相关文章中的信息。 一、安装 electron-builder 首先,你需要在你的 Electron 项目…

云卓SKYDROID-H30——科技改变未来

云卓H30采用高通处理器、搭载安卓嵌入式系统&#xff0c;拥有三个工作频率&#xff0c;让图像更清晰、延迟更低、距离远、抗干扰性强&#xff0c;支持多种接口&#xff0c;更有10.1寸高清工业级阳光可视屏&#xff0c;防尘耐磨&#xff0c;结构强度高&#xff0c;适用于各种严苛…

Python和tkinter单词游戏

Python和tkinter单词游戏 数据字典文本文件&#xff0c;文件名为Dictionary.txt&#xff0c;保存编码格式为&#xff1a;utf-8。文本内容&#xff1a;每行一个 单词 &#xff0c;单词和解释用空格分隔&#xff0c;如 a art.一(个)&#xff1b;每一(个) ability n.能力&#…

springboot实验报告管理系统-计算机毕业设计源码10596

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能分析 …

HarmonyOS Next开发学习手册——单选框 (Radio)

Radio是单选框组件&#xff0c;通常用于提供相应的用户交互选择项&#xff0c;同一组的Radio中只有一个可以被选中。具体用法请参考 Radio 。 创建单选框 Radio通过调用接口来创建&#xff0c;接口调用形式如下&#xff1a; Radio(options: {value: string, group: string})…

高考不是终点:如何利用教育资源实现人生跃迁?普鲁士教育的利弊,你了解吗?从科举到高考,中国教育的变迁!链接上层,获取核心资源的途径

高考已经结束&#xff0c;这两天分数将会陆续出来&#xff0c;无论结果好坏&#xff0c;我都希望你明白一些道理。这些道理在学校老师不会教你&#xff0c;但是非常重要。 一、中国的科举制度 科举制度是为王朝服务的。 科举制度是中国古代通过考试选拔官员的制度&#xff0c…

C++类型转换可调用对象

目录 C的四种可视性类型转换 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast C中的可调用对象 普通函数 函数指针 仿函数 Lambda表达式 包装器function bind C的四种可视性类型转换 C语言中的类型转换是不安全、不明确的&#xff0c;于是C就出了更…

MQTT QoS 0, 1, 2

目录 # 开篇 1. 精细MQS TT QoS的行为 1.1 QoS 0: 最多交付一次&#xff08;At Most Once&#xff09; 1.2 QoS 1: 至少交付一次&#xff08;At Least Once&#xff09; 1.3 QoS 2: 只交付一次&#xff08;Exactly Once&#xff09; 1.4 传输过程图示 1.5 总结 2. MQTT…

HTTP协议头中X-Forwarded-For是能做什么?

X-Forwarded-For和相关几个头部的理解 $remote_addr 是nginx与客户端进行TCP连接过程中&#xff0c;获得的客户端真实地址. Remote Address 无法伪造&#xff0c;因为建立 TCP 连接需要三次握手&#xff0c;如果伪造了源 IP&#xff0c;无法建立 TCP 连接&#xff0c;更不会有后…

javascript 的 属性、方法、事件

使用 javascript 设计一个学生类、&#xff08;属性&#xff1a;ID、姓名、性别,方法&#xff1a;学习、休息、&#xff0c;事件&#xff1a;上学、放学、上课、下课&#xff09;学校有定时器每1秒钟触发一次时钟事件&#xff0c;每节课45分钟&#xff0c;课间15分钟 var Stud…

13. Lammps入门in文件简介-1

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;Lammps入门in文件简介-1 文章目录 01 in文件简介02 in文件命令解析规则 书回正文 Lammps通过一次一行地从输入脚本&#xff08;文本文件&#xff0c;通常称in文件&#xff09;中读取命令来执行计算&#xff0c;当输入…

7-1作业

1.实验目的&#xff1a;完成字符收发 led.h #ifndef __GPIO_H__ #define __GPIO_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC,GPIO,UART初始化 void init();//字符数据发送 void set_tt…

Web端登录页和注册页源码

前言&#xff1a;登录页面是前端开发中最常见的页面&#xff0c;下面是登录页面效果图和源代码&#xff0c;CV大法直接拿走。 1、登录页面 源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登录</ti…

Django 和 Django REST framework 创建对外 API

1. 环境准备 确保你已经安装了 Python 和 Django。如果尚未安装 Django REST framework&#xff0c;通过 pip 安装它&#xff1a; pip install djangorestframework 2. 创建 Django 项目 如果你还没有 Django 项目&#xff0c;可以通过以下命令创建&#xff1a; django-ad…

每日复盘-20240701

今日关注&#xff1a; 20240701 六日涨幅最大: ------1--------301182--------- 凯旺科技 五日涨幅最大: ------1--------300977--------- 深圳瑞捷 四日涨幅最大: ------1--------300977--------- 深圳瑞捷 三日涨幅最大: ------1--------300461--------- 田中精机 二日涨幅最…

Lua实现链表(面向对象应用)

Lua实现面向对象 面向对象核心三要素Lua面向对象大致原理面向对象示例继承与多态示例 面向对象核心三要素 1.封装&#xff1a;对一个事物的抽象为一些属性和行为动作的集合&#xff0c;封装将属性和行为动作&#xff08;操作数据的方法&#xff09;绑定在一起&#xff0c;并隐藏…

快钱支付股东全部股权已被质押!

根据近期工商信息&#xff0c;第三方支付机构快钱支付清算信息有限公司&#xff08;简称“快钱支付”&#xff09;实际控股方快钱金融服务&#xff08;上海&#xff09;有限公司&#xff08;简称“快钱金融”&#xff09;&#xff0c;作为出质股权标的企业&#xff0c;被出质给…