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

目录
  • 零碎记事
  • 为什么要把程序封装成库
  • 博主的环境
  • 封装步骤
    • 准备好待封装的程序
  • 开始封装
    • 配置项目
  • 编译
  • 找到编译好的静态库
  • 打包
  • 使用静态库使用步骤包含头文件
  • 添加链接路径
  • 源文件设置
  • 项目设置

零碎记事

  距离上次发博客已经有一年半了,转眼间我也是从做图像研究到了做游戏开发,说起来看看前面的博文,本来就有前兆的东西呢(笑)......因为主要还是在使用虚幻引擎,所以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里是这样的:

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

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

编译

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

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

找到编译好的静态库

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

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

打包

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

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

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

  新建了个程序,要用到我写的那个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;
}

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

添加链接路径

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

源文件设置

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

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

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

项目设置

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

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

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

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

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

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

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

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

到此这篇关于C++封装静态链接库和使用的文章就介绍到这了,更多相关C++静态链接库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C++的JSON静态链接库JsonCpp的使用方法

    JsonCpp部署方法: 在http://sourceforge.net/projects/jsoncpp/中下载最新版本的jsoncpp库源码. 之后将jsoncpp-src-版本号-tar.gz解压出来,打开makefiles中的jsoncpp.sln进行编译,之后build文件夹下的vs71\debug\lib_json中会有一个.lib静态链接库. JsonCpp主要包含三种类型的class:Value Reader Writer. jsoncpp中所有对象.类名都在namespace

  • dev-c++创建lib(静态链接库)文件的实现步骤

    目录 第一步:制作静态链接库 第二步:链接静态链接库 方法一:使用项目 方法二:修改编译选项 第三步:使用库函数 方法一 方法二: 虽说dev-c++适合初学者,但是它的功能还是很强大的.那如何用它制作一个lib(静态链接库)呢? 第一步:制作静态链接库 1.打开dev-c++,选择“新建-项目”,如下图所示. 2.选择“Static Library”,并选择编程语言(c和c++无所谓)以及给项目设置名称. 3.选择你要保存的位置. 4.在新建的文件里添加函数,我这里添加了两个:一个叫hello

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

    目录 零碎记事 为什么要把程序封装成库 博主的环境 封装步骤 准备好待封装的程序 开始封装 配置项目 编译 找到编译好的静态库 打包 使用静态库使用步骤包含头文件 添加链接路径 源文件设置 项目设置 零碎记事 距离上次发博客已经有一年半了,转眼间我也是从做图像研究到了做游戏开发,说起来看看前面的博文,本来就有前兆的东西呢(笑)......因为主要还是在使用虚幻引擎,所以C++的东西会碰到多一些. 以后程序技术方面的文章就放博客,游戏设计相关的杂谈就放知乎那边吧,博主的知乎可以通过友链过去. B站

  • GCC 编译使用动态链接库和静态链接库的方法

    1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后库

  • Linux静态链接库与模板类的处理方式

    在阅读本文之前,小编先给大家介绍一篇相关文章:Linux静态链接库使用类模板的快速排序算法 大家首先看下以上的文章对理解下面的知识点会有很大的帮助. 当模板遇到静态链接库会发生什么呢. 我们先按照常规思路去考虑一个静态链接库的步骤: 1.将某些功能提取出来,放进一个cpp文件,并将接口或者对外导出的类放在头文件中 2.gcc -c编译该文件,生成.o 3.ar命令将.o文件打包成.a,即静态链接库 4.编译main函数,并将该静态链接库链接,生成可执行文件. OK,按照这个思路,我们将之前写的快

  • Go编译32位GNU静态链接库的方法

    Go链接库系统的难用可谓是人尽皆知,不同Go版本编译出来的不兼容,而且只支持GNU的,不能编译出Windows上的dll和lib. 本次有需求是将Go代码编译成32位GNU静态链接库. Go代码 编写代码如下: package main import "C" //export Add func Add(a, b int32) int32 { return a + b } func main() {} 注意我们必须把想要导出的函数显式使用//export Add注释标明,否则编译后不会产

  • Linux静态链接库使用类模板的快速排序算法

    快速排序的本质是从数组中选一个参考值ref,比该参考值的大的,将其放在ref的右边,比ref小的放在左边,然后不断的对两边重复执行该动作 我们先列出来快速排序的步骤: 1.从数组中选一个参考值ref,比该参考值的大的,将其放在ref的右边, 上面的动作将数组划分为两部分: A ref B A是比ref小的数组元素集合,它仍然是数组,B是比ref大的元素集合,它也仍然是数组 2.在对ref左右两边的元素重复上述动作,直到A和B都只剩下一个元素,那么排序就算完成了. 重点是如何分别选出来两个集合A和

  • 链接库动态链接库详细介绍

    windows中,链接库分为两种类型:静态链接库.lib和动态链接库.dll.其中动态链接库在被使用的时候,通常还提供一个.lib,称为引入库,它主要提供被Dll导出的函数和符号名称,使得链接的时候能够找到dll中对应的函数映射. 静态链接库和动态链接库的作用相似,都是提供给其他程序进行调用的资源.其中,动态链接库的调用方法分隐式调用(静态导入调用)和显示调用(动态导入调用). 编译环境: Microsoft Visual Stdio 2010 -------------------------

  • C++静态链接与动态链接详解

    目录 一.GCC工作流程 二.静态链接与动态链接 1.静态链接 2.动态链接 总结 一.GCC工作流程 预处理:把#头文件展开,进行宏替换,去掉注释(生成.i文件) 编译:把预处理后的文件生成汇编文件(.s文件),主要是检查语法.语义问题 汇编:把汇编文件生成目标文件(.o文件) 链接:将函数库中相应的代码组合到目标文件,生成可执行文件(默认a.out文件) o文件不会立即执行,因为可能出现:一个.cpp文件中的函数引用了另一个.cpp文件中定义的符号/调用了某个库文件中的函数.链接的目的就是将

  • Qt图形图像开发之曲线图表库QtChart编译安装详细方法与使用实例

    Qt曲线图表库QtChart简介 Qt的线性绘图控件有大名鼎鼎的Qwt,ChartDirector,小巧玲珑的QCustomPlot,当然还有自家的QtChart.长久以来QtChart在Qt家族里一直是收费的模块,只有商业版才可以使用,但Qt5.7之后将开放其权限,可参见:Qt 5.7 亮瞎眼的更新.下面将介绍如何安装QtChart并进行简单的绘图. Qt曲线图表库QtChart下载 这里用git下载QtChart,参考Qt Charts 5.7.0 安装教程 Git地址:https://gi

随机推荐