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

article/2025/9/29 8:56:42

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

有时我们需要把自己的程序交给第三方调用,但是又不想被别人看到自己的具体实现代码,就封装成库给别人使用。库有动态链接库和静态链接库,区别是动态链接库可以在程序运行时动态链接,而静态链接库相当于.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++封装库和使用的全部内容了,觉得有学到的话可以点个赞嘿嘿。


http://chatgpt.dhexx.cn/article/V9FI1d13.shtml

相关文章

C++ 创建静态链接库和动态链接库

上篇文章演示了如何使用C 编译的静态链接库和动态链接库&#xff0c;本篇文章主要介绍如何创建静态链接库和动态链接库&#xff0c;本文使用的工具是visual studio 2019 企业版&#xff0c;需要安装对应的Csdk&#xff0c;可以参考网上其他文章&#xff0c;本问不在赘述。 一、…

动态链接库和静态链接库

转载自&#xff1a;https://www.cnblogs.com/king-lps/p/7757919.html &#xff08;有删减&#xff09; 1. 库的介绍 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&…

静态链接库与动态链接库----C/C++

平时我们写程序都必须include很多头文件&#xff0c;因为可以避免重复造轮子&#xff0c;软件大厦可不是单靠一个人就能完成的。但是你是否知道引用的那些头文件中的函数是怎么被执行的呢&#xff1f;这就要牵扯到链接库了&#xff01;&#xff01;&#xff01; 库有两种&#…

【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

前言 不管是在 Windows 下开发&#xff0c;还是在 Linux 下开发&#xff0c;我们都会经常性的使用一些库文件&#xff0c;这些库文件的特点就是&#xff0c;我们可以看到接口的原型并通过这些接口来调用这个函数的功能&#xff0c;但是我们无法查看这个功能的实现。这就是库文…

静态链接库(.lib)和动态链接库(.dll)的使用

静态链接库(.lib)和动态链接库(.dll)的使用 文章目录 静态链接库(.lib)和动态链接库(.dll)的使用一、静态链接库1. 静态链接库概述2. 创建静态链接库3. 调用静态链接库 二、动态链接库(dynamic linking library)1. 动态链接库概述2. 创建动态链接库并导出函数导出函数两种方式1…

静态链接库

库 库的存在&#xff0c;大大方便了我们进行编程。因为有了库&#xff0c;我们不必再从0开始&#xff0c;例如我们大多数人C语言写的第一个程序Hello World!都是用了库函数。以printf为例&#xff0c;我们只需要在程序源代码中包含<stdio.h>这个头文件之后&#xff0c;就…

史上最全Java类型转换

讲类型转换之前&#xff0c;让我来贴张表 基本数据类型的表示范围 类型 长度 表示范围默认值byte8b-128&#xff5e;1270short16b-32768&#xff5e;327670int32b-21147483648&#xff5e;21474836470long64b-9223372036 854 775 808&#xff5e;9223372036 8547758070Lfloat3…

Java:类型转换

public class Demo04 {public static void main(String[] args) {//低--------------------------> 高// byte,short,char->int->long->float->doubleint i 128;byte b (byte) i ;//内存溢出//强制转换 &#xff08;类型&#xff09;变量名 高--低//自动转换…

java强转规则_java类型转换及其规则介绍

一、自动类型转换 整型、实型(常量)、字符型数据可以混合运算。运算中&#xff0c;不同类型的数据先转化为同一类型&#xff0c;然后进行运算。 数据类型转换必须满足如下规则&#xff1a; 1、不能对boolean类型进行类型转换。 2、不能把对象类型转换成不相关类的对象。 3、在把…

Sql-Java类型转换

Mysql-Java字段类型转换 mysql类型名大小用途对应Java类char0-255 bytes定长字符串 &#xff08;姓名、性别、学号&#xff09;Stringvarchar0-65535 bytes变长字符串&#xff08;比上面更长一点的那种&#xff09;Stringtinytext0-255 bytes比较短的那种文本数据&#xff08;…

JAVA类型转换及变量详解

类型转换 由于java是强类型语言&#xff0c;所以要进行有些运算的时候&#xff0c;需要用到类型转换。 byte&#xff08;1个字节&#xff09;,short&#xff08;2个字节&#xff09;,char&#xff08;2个字节&#xff09;----->int&#xff08;4个字节&#xff09;---->…

Java类型转换(自动类型转换+强制类型转换)

一、 自动类型转换(隐式类型转换) 整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。自动转换从低级到高级。 自动转换有以下规律: 1、小的类型自动转化为大的类型 2、整数类型可以自动转化为浮点类型,可能会产生舍入误…

Java的类型转换

需要类型转换的原因:因为Java是强类型的语言&#xff0c;所以有时可能要进行跨类型的运算&#xff0c;这就需要先进行类型转换&#xff0c;再进行运算。 类型转换分为&#xff1a; 强制类型转换(由高-->低时使用)&#xff0c;自动类型转换/ 隐式类型转换(由低-->高时使用…

java中的类型转换

java的基本数据类型 1.数值型&#xff1a;byte&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;float&#xff0c;double 2.字符型&#xff1a;char 3.布尔型&#xff1a;boolean 数据类型占据字节数byte1个字节short2个字节int4个字节long8个字节float4个字节…

Java中各种类型的转化

目录 一.Integer和int之间的类型转化 1.自动装箱 2.构造器方法 3.Integer.valueOf(int i) 二.Integer和String之间的类型转换 1.String转换为Integer 1.Integer.parseInt(String s) ​编辑 2.Integer.valueOf(String s) 2.Integer转换为String 1.Integer.toString() …

【JAVA】Java中的类型转换

目录 1.自动类型转换&#xff08;隐式转换&#xff0c;小类型转换为大类型&#xff09; 2.强制类型转换&#xff08;显示转换&#xff0c;大类型转换为小类型&#xff09; 3.小于4字节的类型转换问题 3.1 byte<->int 3.2 char<->int 3.3 String<->int …

Java 类型转换

一、自动类型转换(隐式类型转换) 整型、实型(常量)、字符型数据可以混合运算。不同类型的数据先转化为同类型再进行运算 自动转换按从低级到高级顺序: char ↓ Byte→short→int→long---›float→double 自动转换有以下规律&#xff1a; 小的类型自动转化为大的类型 整数…

java类型转换

文章目录 1、什么是类型转换&#xff1f; 2、掌握常见数据类型的范围大小 3、自动类型转换 3.1 int转换为double 3.2 char转换为int类型 4、强制类型转换 4.1、强制类型转换格式 5、注意事项 1、什么是类型转换&#xff1f; 在java中类型转换是一个非常重要的知识点。因…

java中常见类型的转换以及方法总结

1.char、String、int类型之间的转换 1.1 char和String的区别 char是表示的是字符&#xff0c;定义的时候用单引号&#xff0c;只能存储一个字符。例如; char‘d’. String表示的是字符串&#xff0c;定义的时候用双引号&#xff0c;可以存储一个或者多个字符。例如&#xff1…

CentOs 无法启动网络,用ip addr看不到IP地址

1.无法启动网卡&#xff0c;启动报file exist 原因1&#xff1a;可能是别的网络与网络冲突 解决&#xff1a;关闭NetworkManager 原因2&#xff1a;etc/sysconfig/network-scripts下的ifcfg开头的文件有内容有冲突 解决&#xff1a;删除一些对应文件 如果还是不行&#xf…