C++封装静态链接库和使用的详细步骤

作者:雾里尘埃 时间:2021-08-28 00:54:13 

零碎记事

距离上次发博客已经有一年半了,转眼间我也是从做图像研究到了做游戏开发,说起来看看前面的博文,本来就有前兆的东西呢(笑)......因为主要还是在使用虚幻引擎,所以C++的东西会碰到多一些。

以后程序技术方面的文章就放博客,游戏设计相关的杂谈就放知乎那边吧,博主的知乎可以通过友链过去。

B站那边的账号也打算开始复活,后面是更新游戏设计杂谈类的视频还是更新虚幻技术方面的视频还在犹豫不决......

为什么要把程序封装成库

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

博主的环境

系统:Window 10

IDE:VS2022

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

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

封装步骤

准备好待封装的程序

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

//Point.h
#pragma once
#include <utility>

typedef std::pair<int, int> Coordinate;
class Point
{
private:
   Coordinate location;
public:
   Point();
   Point(int x, int y);
   Coordinate GetLocation();
   int GetX() const;
   int GetY() const;
   virtual Point operator + (const Point& B) const;
   virtual Point operator - (const Point& B) const;
};
//Point.cpp
#include "Point.h"
Point::Point() :
   location(Coordinate(0, 0))
{
}
Point::Point(int x, int y):
   location(Coordinate(x, y))
{
}
Coordinate Point::GetLocation()
{
   return location;
}
int Point::GetX() const
{
   return location.first;
}
int Point::GetY() const
{
   return location.second;
}
Point Point::operator+(const Point& B) const
{
   return Point(GetX()+B.GetX(), GetY()+B.GetY());
}
Point Point::operator-(const Point& B) const
{
   return Point();
}

开始封装

配置项目

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

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

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

C++封装静态链接库和使用的详细步骤

C++封装静态链接库和使用的详细步骤

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

编译

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

C++封装静态链接库和使用的详细步骤

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

C++封装静态链接库和使用的详细步骤

找到编译好的静态库

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

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

C++封装静态链接库和使用的详细步骤

打包

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

C++封装静态链接库和使用的详细步骤

使用静态库使用步骤包含头文件

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

C++封装静态链接库和使用的详细步骤

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

//使用静态库.cpp
#include <iostream>
#include "大摸鱼师千里的Point类/Point.h"
using namespace std;

int main()
{
   Point a(1, 2);
   Point b(3, 4);
   Point c = a + b;
   cout << c.GetX() << ", " << c.GetY() << endl;

return 0;
}

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

C++封装静态链接库和使用的详细步骤

添加链接路径

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

源文件设置

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

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

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

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

//使用静态库.cpp
#include <iostream>
#include "大摸鱼师千里的Point类/Point.h"
using namespace std;

#pragma comment(lib, "大摸鱼师千里的Point类/Point.lib")

int main()
{
   Point a(1, 2);
   Point b(3, 4);
   Point c = a + b;
   cout << c.GetX() << ", " << c.GetY() << endl;

return 0;
}

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

C++封装静态链接库和使用的详细步骤

项目设置

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

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

C++封装静态链接库和使用的详细步骤

C++封装静态链接库和使用的详细步骤

C++封装静态链接库和使用的详细步骤

C++封装静态链接库和使用的详细步骤

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

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

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

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

C++封装静态链接库和使用的详细步骤

C++封装静态链接库和使用的详细步骤

C++封装静态链接库和使用的详细步骤

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

C++封装静态链接库和使用的详细步骤

来源:https://www.cnblogs.com/wulichenai/p/16563452.html

标签:C++,静态,链接库
0
投稿

猜你喜欢

  • 浅谈Java内省机制

    2021-06-13 17:54:05
  • Java中对象与C++中对象的放置安排的对比

    2022-05-31 15:07:18
  • Java的split方法使用详解

    2021-10-03 06:09:57
  • Spring Boot 实现图片上传并回显功能

    2021-10-11 17:45:20
  • C#实现Word转换TXT的方法详解

    2022-12-26 04:27:57
  • Spring Security 实现用户名密码登录流程源码详解

    2023-05-31 11:13:59
  • 基于Spring中的线程池和定时任务功能解析

    2022-08-20 03:49:45
  • springboot注册拦截器所遇到的问题

    2023-01-17 21:18:30
  • SpringBoot新手入门的快速教程

    2021-09-28 23:23:25
  • Activiti7整合Springboot使用记录

    2022-11-11 06:17:24
  • C#实现获取鼠标句柄的方法

    2022-05-06 21:13:41
  • 浅谈Java面向接口编程

    2021-07-25 16:29:58
  • 服务器端C#实现的CSS解析器

    2022-01-25 12:26:20
  • C#中重载重写和覆盖的定义与区别

    2022-04-23 09:25:34
  • 教你怎么使用hadoop来提取文件中的指定内容

    2021-07-08 02:22:50
  • C#最简单的关闭子窗体更新父窗体的实现方法

    2021-07-24 18:58:27
  • git忽略特殊文件_动力节点Java学院整理

    2023-02-26 19:27:47
  • Java中的AQS同步队列问题详解

    2021-08-16 19:50:23
  • C#基础教程之IComparable用法,实现List<T>.sort()排序

    2023-11-03 07:07:46
  • 详解Java中Optional类的使用方法

    2023-11-25 05:22:28
  • asp之家 软件编程 m.aspxhome.com