博客
关于我
C++ 静态库与动态库以及在 Windows上 的创建、使用
阅读量:443 次
发布时间:2019-03-06

本文共 2234 字,大约阅读时间需要 7 分钟。

库的概念与使用

一、库的概念

库是一种存储已编写、成熟且可复用的代码的文件。每个程序都依赖于大量基础层级的库,从而避免了从零开始编写所有代码的复杂性。库可以分为两种:静态库动态库

静态库的本质

静态库是以二进制形式存在的可执行代码,可以直接被操作系统加载到内存中执行。静态库的特点是:

  • 静态链接:在编译阶段,将目标文件(如.o文件)与静态库一起链接到可执行文件中。
  • 文件格式:静态库可以看作是一组目标文件(.o.obj文件)的集合,经过压缩打包形成一个单一文件。
  • 动态库的本质

    动态库的特点是延迟链接,即在程序运行时才将其链接到目标代码中。动态库的优势在于:

  • 资源共享:在内存中只需保留一份动态库的实例,便可供多个程序使用。
  • 灵活更新:仅需更新动态库即可,不影响已有程序的运行。
  • Windows 下静态库的创建与使用

    3.1 创建静态库

    在 Windows 环境下,使用 Visual Studio 创建静态库分为以下步骤:

  • 编译目标文件:使用 cl /c StaticMath.cpp 生成 StaticMath.obj 文件。
  • 链接目标文件:使用 lib StaticMath.obj 生成静态库 StaticMath.lib
  • 通过 Visual Studio 的工程设置(勾选静态库类型),可以更方便地创建静态库。

    3.2 使用静态库

    在 Windows 下使用静态库的步骤如下:

  • 添加静态库依赖

    • 在项目属性的“链接器” > “常规”中,附加依赖库目录。
    • 在“链接器” > “输入”中添加静态库文件(如 StaticMath.lib)。
  • 编译与运行:完成配置后,编译项目即可生成可执行文件。

  • 通过上述方法,您可以轻松将自定义的静态库集成到项目中。

    Windows 下动态库的创建与使用

    5.1 创建动态库

    在 Windows 下创建动态库需要注意以下几点:

  • DllMain 函数:创建 DLL 时,需要提供一个 DllMain 函数处理不同线程和进程的初始化。
  • 导出函数:导出的函数需要使用 __declspec(dllexport) 关键字进行声明。
  • 以下是一个简单的动态库示例:

    #pragma onceclass DynamicMath {public:    __declspec(dllexport) DynamicMath(void);    __declspec(dllexport) ~DynamicMath(void);    static __declspec(dllexport) double add(double a, double b);    static __declspec(dllexport) double sub(double a, double b);    static __declspec(dllexport) double mul(double a, double b);    static __declspec(dllexport) double div(double a, double b);    __declspec(dllexport) void print();};

    5.2 使用动态库

    在 Windows 下使用动态库的步骤:

  • 添加动态库依赖

    • 在项目属性的“链接器” > “常规”中,附加依赖库目录。
    • 在“链接器” > “输入”中添加动态库文件(如 DynamicLibrary.lib)。
  • 编译与运行:完成配置后,编译项目即可生成可执行文件。

  • 显式调用动态库

    在 Windows 下,显式加载动态库需要使用 LoadLibraryGetProcAddress 函数。以下是一个示例:

    #include "DynamicMath.h"#include 
    #include
    using namespace std;int main() { double a = 10; double b = 2; HMODULE hDll = LoadLibrary("DynamicMath.dll"); if (hDll == NULL) { cout << "无法加载动态库" << endl; return 1; } double (*addFunc)(double, double) = GetProcAddress(hDll, "add"); double result = addFunc(a, b); cout << "a + b = " << result << endl; FreeLibrary(hDll); system("pause"); return 0;}

    总结

    静态库和动态库的主要区别在于代码的链接时间:

    • 静态库:在编译阶段链接到目标代码中,运行时不依赖该库。
    • 动态库:在运行时才被链接到目标代码中,运行时依赖该库。

    优缺点对比

    • 静态库

      • 优点:链接速度快,移植方便。
      • 缺点:文件体积较大,不便更新。
    • 动态库

      • 优点:文件体积小,更新方便。
      • 缺点:依赖外部库,初次加载需要时间。

    在实际开发中,选择静态库或动态库取决于具体需求。如果只是简单的代码复用或快速移植,静态库是更好的选择。

    转载地址:http://bgsyz.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
    查看>>
    OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
    查看>>
    OpenCV与AI深度学习 | YOLOv8自定义数据集训练实现火焰和烟雾检测(代码+数据集!)
    查看>>
    OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
    查看>>
    OpenCV与AI深度学习 | 一文带你读懂YOLOv1~YOLOv11(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)
    查看>>
    OpenCV与AI深度学习 | 什么是 COCO 数据集?
    查看>>
    OpenCV与AI深度学习 | 低对比度缺陷检测应用实例--LCD屏幕脏污检测
    查看>>
    OpenCV与AI深度学习 | 使用 MoveNet Lightning 和 OpenCV 实现实时姿势检测
    查看>>
    OpenCV与AI深度学习 | 使用 OpenCV 创建自定义图像滤镜
    查看>>
    OpenCV与AI深度学习 | 使用 SAM 和 Grounding DINO 分割卫星图像
    查看>>
    OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光
    查看>>
    OpenCV与AI深度学习 | 使用OpenCV检测并计算直线角度
    查看>>
    OpenCV与AI深度学习 | 使用OpenCV轮廓检测提取图像前景
    查看>>
    OpenCV与AI深度学习 | 使用Python和OpenCV实现火焰检测(附源码)
    查看>>