C++封装静态链接库及使用

2023-05-16

一、为什么要把程序封装成库

有时我们需要把自己的程序交给第三方调用,但是又不想被别人看到自己的具体实现代码,就封装成库给别人使用。库有动态链接库和静态链接库,区别是动态链接库可以在程序运行时动态链接,而静态链接库相当于.cpp文件,在编译时的链接阶段就链接进去了。

二、博主的环境

系统:Window 10

IDE:VS2022

如果在使用的是其他IDE的,看完这个自己应该也能知道用其他IDE该怎么操作,其实就是一个对编译和链接过程的理解深度的问题,懂了在哪里都能自己封装和使用库的。

这边的演示有中文路径,VS对中文路径支持得确实还挺可以的,不会报错。不过建议大家还是尽量别这样了,就怕万一你那边对中文路径支持不好,编译出问题。

三、封装步骤

准备好待封装的程序

我准备了一个Point类,就当做是要给别人用的,现在我就把这个类封装成静态库。


   
   
  1. //Point.h
  2. #pragma once
  3. #include <utility>
  4. typedef std::pair< int, int> Coordinate;
  5. class Point
  6. {
  7. private:
  8. Coordinate location;
  9. public:
  10. Point();
  11. Point( int x, int y);
  12. Coordinate GetLocation();
  13. int GetX() const;
  14. int GetY() const;
  15. virtual Point operator + ( const Point& B) const;
  16. virtual Point operator - ( const Point& B) const;
  17. };

   
   
  1. //Point.cpp
  2. #include "Point.h"
  3. Point:: Point() :
  4. location( Coordinate( 0, 0))
  5. {
  6. }
  7. Point:: Point( int x, int y):
  8. location( Coordinate(x, y))
  9. {
  10. }
  11. Coordinate Point::GetLocation()
  12. {
  13. return location;
  14. }
  15. int Point::GetX() const
  16. {
  17. return location.first;
  18. }
  19. int Point::GetY() const
  20. {
  21. return location.second;
  22. }
  23. Point Point:: operator+( const Point& B) const
  24. {
  25. return Point( GetX()+B. GetX(), GetY()+B. GetY());
  26. }
  27. Point Point:: operator-( const Point& B) const
  28. {
  29. return Point();
  30. }

开始封装

配置项目

平常我们是编译成可执行文件(即.exe),现在我们设置一下,改成编译成静态库(即.lib)。

这个设置在VS2022里是这样的:

右击项目->属性->配置属性->常规->配置类型->改为静态库

这样我们编译出来的东西就不是.exe文件,而是.lib文件了,也就是静态链接库。

编译

这边在VS2022里,编译就是生成。

就跟编译普通程序一样,编译成功。

找到编译好的静态库

自己翻翻项目下面的文件夹,能找到编译出来的静态库的。

我这边是 项目根目录/x64/Debug/项目名.lib,就是下图里的那个Point.lib,这就是静态库。

打包

其实就是把头文件跟静态库一起给别人就行了,静态库的作用跟.cpp文件差不多,使用时就是包含头文件,然后链接到静态库把实现关联起来即可。

四、使用静态库

使用步骤

包含头文件

新建了个项目,这个项目要用到我的那个Point类,为了方便包含头文件,我把上边的那个有Point.h有和Point.lib的文件夹挪到新项目文件夹下了。

新建了个程序,要用到我写的那个Point类,那就先包含Point.h,里面有关于Point类的声明。


   
   
  1. //使用静态库.cpp#include <iostream>
  2. #include "大摸鱼师千里的Point类/Point.h"
  3. using namespace std;
  4. int main()
  5. {
  6. Point a(1, 2);
  7. Point b(3, 4);
  8. Point c = a + b;
  9. cout << c. GetX() << ", " << c. GetY() << endl;
  10. return 0;
  11. }

但是这个时候编译还是通不过的,如下图报了“无法解析外部符号”,是链接的错误来的。头文件虽然有Point类声明信息,但没有实现的信息,实现的信息在静态库里,但是现在链接器还找不到静态库,所以报错了。

添加链接路径

有两种方法,一种是在源文件里设置,另一种是在项目里设置。

源文件设置

先讲在源文件里设置,其实就是加个编译头告诉链接器静态库的路径而已,语法如下:


#pragma comment(lib, 你的静态库路径)  

这样子链接器在搜索默认的库文件路径外,还会搜你这里的设的静态库路径。

在我这里,加了就是会变成这样:


   
   
  1. //使用静态库.cpp
  2. #include <iostream>
  3. #include "大摸鱼师千里的Point类/Point.h"
  4. using namespace std;
  5. #pragma comment(lib, "大摸鱼师千里的Point类/Point.lib")
  6. int main()
  7. {
  8. Point a(1, 2);
  9. Point b(3, 4);
  10. Point c = a + b;
  11. cout << c. GetX() << ", " << c. GetY() << endl;
  12. return 0;
  13. }

因为链接器找到路径了,编译就能过了,程序正常运行,效果如下。

项目设置

VS2022里是这么设置链接器搜索的库目录的

先是设置库的目录,项目属性->VC++目录->库目录->编辑->新行->把静态库所在目录添加进去

因为这个时候只是加了搜索的库目录,但是还没有具体到哪个库,可以像上边那样用编译头来指定,就是不加相对路径直接指定静态库,就像这样。

#pragma comment(lib, "Point.lib")
   
   

现在讲怎么在项目里配置具体到指定库。

项目属性->链接器->输入->附加依赖项->编辑->添加你的库

设完就是不加编译头也能编译运行程序了,这是效果

以上就是C++封装库和使用的全部内容了,觉得有学到的话可以点个赞嘿嘿。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++封装静态链接库及使用 的相关文章

  • YOLOX网络结构

    本文为博主DaneAI原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 原文链接 xff1a https blog csdn net happyday d article detai
  • 阿木实验室P450无人机硬件接线图备忘录

    其中数传是定制的 xff0c 相当于是路由器 43 数传二合一 xff0c 既负责地面站计算机与pixhawk的通讯 xff0c 又负责发射WiFi信号 组建局域网 xff0c 使板载英伟达NX上位机和手机 平板 笔记本电脑等远程终端连接在
  • yolov3损失函数公式及代码位置,绝对良心(更新)

    版本 xff1a darknet yolov3 环境 xff1a ubuntu16 04 本人小白 xff0c 毕设正在做基于yolov3的目标检测系统研究 xff0c 在网上找了一万遍 xff0c 基本没有靠谱的损失函数 xff0c 全是
  • 使用http协议Header中的Authorization传递token

    1 span class token annotation punctuation 64 GetMapping span span class token punctuation span span class token string 3
  • Shell命令之终端打开网页

    一句话用Safari打开百度 span class hljs built in open span span class hljs operator a span span class hljs string 34 Applications
  • 数据结构期末复习五:内部排序

    排序的基本概念和分类 排序 xff1a 将杂乱无章的数据按关键字递增 xff08 或递减 xff09 有序排列 假设Ki 61 Kj xff0c 排序前Ri领先于Rj 稳定排序 xff1a 排序后的序列Ri仍领先于Rj 不稳定排序 xff1
  • 数据同步工具DataX从Mysql同步数据到HDFS实战

    目录 1 查看数据同步模板2 高可用HA的HDFS配置3 MysqlReader针对Mysql类型转换说明4 HdfsWriter支持大部分Hive类型5 Mysql准备数据如下6 新建job mysql2hdfs json7 执行job8
  • 目标检测yolov3+文字识别CRNN 实现文本检测和识别

    参考链接 xff1a https github com chineseocr chineseocr https zhuanlan zhihu com p 34757009 https wenku baidu com view f4ec95e
  • 关于51单片机串口通信的相关知识(寄存器)

    一 51单片机串口概念 1 51单片机的串行口 51单片机的串行口是一个可编程全双工的通信接口 xff0c 具有UART xff08 通用异步收发器 xff09 的全部功能 2 51单片机的硬件连接 简单双向串口通信有两根数据通信线 xff
  • Linux服务器--TCP协议详解

    1 TCP服务的特点 传输层协议主要有两个 xff1a TCP协议和UDP协议 TCP协议相对于UDP协议的特点是 xff1a 面向连接 字节流 可靠传输 使用TCP协议通信的双方必须先建立连接 xff0c 然后才能开始数据的读写 双方都必
  • strpbrk函数

    strpbrk函数 1 函数功能 xff1a strpbrk是在源字符串 xff08 s1 xff09 中找出最先含有搜索字符串 xff08 s2 xff09 中任一字符的位置并返回 xff0c 若找不到则返回空指针 2 头文件 span
  • win10自带的office365怎么找到安装目录+mathtype

    遇到问题 xff0c 因为我要安装mathtype xff0c 但是一直显示错误代码53 显示运行时未找到mathpage wll 一般都在office文件夹中 xff0c 但是365死活在files和data中都找不到 xff0c 运行目
  • 面试问题记录

    csdn https www cnblogs com yinrw p 10795210 html 问题比较全面 问卷星 https www wjx cn xz 109293287 aspx 简述你在以前的工作中做过哪些事情 xff0c 比较
  • 学习记录2

    这是一个名字 新版换了之后跟之前的完全不太一样了 shell相关 Shell字符串截取 xff08 非常详细 xff09 苍青浪 博客园 这是一个快引用 linux相关 查看内容占用情况 输出 free m sed n 39 2p 39 a
  • leetcode 100热题

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言标题easy问题合集1 有效括号问题 前言 提示 xff1a leetcode简单题目100题中的easy部分 xff1a
  • java小项目之成绩管理、排课软件、局域网聊天软件

    大三下 xff0c 想把上个学期的一些东西整理一下 可能是突然有点想法吧 我把答辩ppt以及文档要求还有项目文件夹全部都放在了我的github里面啦 点击打开链接 项目一 问题描述 xff1a 教师在教学过程中 xff0c 需要记录学生的成
  • LeetCode 114 二叉树转链表

    一 题目 分析 xff1a xff08 1 xff09 要求转化为先序遍历顺序 xff0c 这个很容易想到设置一个链表 xff0c 然后先序遍历二叉树 xff0c 把节点和指针记录在链表就好了 xff08 2 xff09 题目要求in pl
  • 使用gstreamer,rtsp拉流,保存图像, jeston,使用硬件加速nvdec/nvenc

    jeston xff0c 拉流 xff0c 使用硬件加速nvdec nvenc span class token macro property span class token directive hash span span class
  • LeetCoed 无重复字符的最长子串(java)

    一 题目分析 分析 xff1a 最长子串 xff0c 而不是最长子序列 子串是字符串连续的一段 xff0c 子序列是可以不连续的 所以有一种方法叫做滑动窗口法 xff0c 我记得左程云老师讲过 xff0c 那个题是计算窗口内最大或者最小值的
  • leetcode 127 单词接龙(搜索 java)

    就是给一个单词词典 xff0c 给一个开始词汇和结束词汇 xff0c 在词典中找出开始词汇转变成结束词汇的过程 xff0c 求转变次数 每次只能转变单词的一个字符 可能会有多条路径可以到达 xff0c 搜索问题可以用DFS BFS解决 xf

随机推荐

  • gtest单元测试配置+vs 2015+OpenCppCoverage输出测试覆盖率 || cmake命令构建项目以及编译以及命令行测试

    目录 一 仅使用gtest 43 vs2015 1 下载和编译gtest 2 创建具体的项目 3 gtest自带十个例子 二 使用gtest 43 vs2015 xff0c 并且输出测试覆盖率 1 使用vs 2015企业版 2 使用Open
  • Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)

    cmake一些语法定义 之前的博客主要写了怎么配置gtest项目 xff0c 但是一般项目代码和测试代码并不在一起 xff0c 所以尝试将代码分离 主要分成三个部分 xff0c 下面给出demo的分级目录 gtest demo CMakel
  • WGS-84 ECEF ENU 坐标系学习记录

    地球坐标系固定在地球上而随地球一起在空间做公转和自转运动 xff0c 因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化 地心地固直角坐标系和大地坐标系都属于这种坐标系 一 几种坐标系 地心地固直角坐标系 xff08 ECEF
  • 关于大学生计算机未来发展的个人规划

    本人今年大二 xff0c 计算机专业 xff0c 和很多大学生一样 xff0c 在大一期间仍保持着高中的习惯 xff0c 每天只是上课听讲 xff0c 课后写作业 xff0c 复习与预习 可以说 xff0c 除了课堂上老师讲的知识和书本上有
  • 关于scanf的一些注意事项

    第一点 xff0c 设定的接受变量应以地址的方式出现在scanf内 xff0c 这是因为scanf本身是一个函数 xff0c 若不加地址相当于值传递 xff0c 无法改变对应变量的值 如 xff1a 规定输入类型是整形 xff08 d xf
  • 关于长度未知,输入几组数据之后如何终止输入

    首先 xff0c 应确定结束标准 xff0c 一般题目中会给出以输入 xffe5 或者负数之类的结束 xff0c 若题中没给 xff0c 正常情况下我们自己编码是习惯以回车作为结束符号 故可以用getchar xff08 xff09 接受一
  • 关于TortoiseGit的个人见解

    首先先放一个下载链接 xff1a Download TortoiseGit Windows Shell Interface to Git TortoiseGit是一个用于用户本身和gitee之间进行文件传输的中介 xff0c 本质上是用来简
  • c语言实现扫雷

    实现在9乘9的格子内实现扫雷游戏 xff0c 可修改格子的大小和雷的个数 思路 xff1a 初始利用随机数种子生成10个雷的位置 xff0c 通过输入x xff0c y坐标来显示当前格子是否是雷 xff0c 若是雷游戏结束 xff0c 显示
  • 使用Gstreamer拉取rtsp流,使用jeston硬件加速解码,并保存buffer为图片。

    编译 xff1a g 43 43 demo666 cc o demo666 span class token variable span class token variable 96 span pkg config cflags libs
  • 矩阵键盘驱动代码

    此代码仅提供了代码思路 xff0c 具体移植应用可以私信博主 key c include 34 stm32f10x h 34 include 34 key h 34 include 34 led h 34 include 34 sys h
  • 对于vs份文件编写代码的一些个人见解

    先说明一下为何要将代码写在不同的文件中 xff0c 这对于初学者来说可能是多此一举的 xff0c 因为明明在一个文件中就能完成的事 xff0c 为何要在多个文件中分别写 xff0c 繁琐还容易出错 先让我们明确一个观点 xff0c 就是一个
  • 不产生新变量的情况下交换整数

    思路 xff1a 利用其中一个变量同时存储两个变量的信息 xff0c 而后利用某些运算使得可以在知道其中一个的情况下求出另外一个 具体代码如下 xff1a void exchange1 int ex1 int ex2 ex1 61 ex2
  • 如何求一个数二进制1的个数

    思路 xff1a 方法1 xff1a 可以先求二进制的样式 xff0c 再计算其中1的个数 求二进制就是不断对2除和取余 xff0c 余数组成二进制 xff0c 除的结果做下次对2除和取余 xff0c 直到数字为0 方法2 xff1a 可以
  • BLE5.0蓝牙通信原理及TI BLE协议栈在CC2642上的应用

    蓝牙可以分为经典蓝牙和低功耗蓝牙 xff0c 本文重点介绍低功耗蓝牙 xff08 BLE 一 BLE协议栈结构 以TI的CC26XX芯片为例 xff0c BLE协议栈可以由如下图所示部分组成 xff1a 1 物理层 xff1a 物理层是BL
  • RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

    分析一 xff1a 232串口信号 要点 xff1a RS232 xff0c 全双工 xff0c 采用三线制传输分别为TXD RXD GND xff0c 其中TXD为发送信号 xff0c RXD为接收信号 在RS232中任何一条信号线的电压
  • SVN 拉取分支(Branch/tag)和SVN合并(Merge)

    合并 xff08 Merge xff09 例子 xff1a 把对feature branch project name v3 3 7 branch的修改合并到develop 步骤1 xff1a 如图 xff0c 右键目标文件夹 xff0c
  • 宏#define的三种基本定义方式:固定值,表达式,运算符。

    define xff1a define是C语言中的预处理命令 xff0c 预处理命令以 开头 xff0c 比如我们经常写的代码 include lt stdio h gt 也是预处理命令 define用于宏定义 xff0c 作用是方便程序段
  • 四旋翼飞行器的姿态解算小知识点

    1 惯性测量单元IMU InertialMeasurement Unit 姿态航向参考系统AHRS Attitude and Heading Reference System 地磁角速度重力MARG Magnetic Angular Rat
  • 四元数姿态解算中的地磁计融合解读

    笔者最近在做四轴 xff0c 涉及到地磁计的融合算法 xff0c 网上大多数是x IMU的融合代码 xff0c 但是这段代码对于地磁计的融合说明没有做过多的解释 xff0c 网上没有相关讨论 xff0c 仅在阿莫论坛看到一篇相关的代码解释
  • C++封装静态链接库及使用

    一 为什么要把程序封装成库 有时我们需要把自己的程序交给第三方调用 xff0c 但是又不想被别人看到自己的具体实现代码 xff0c 就封装成库给别人使用 库有动态链接库和静态链接库 xff0c 区别是动态链接库可以在程序运行时动态链接 xf