博客
关于我
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/

    你可能感兴趣的文章
    OTA测试
    查看>>
    Oulipo
    查看>>
    Outlook 2010 Inside Out
    查看>>
    overlay(VLAN,VxLAN)、underlay网络、大二层概述
    查看>>
    OWASP漏洞原理<最基础的数据库 第二课>
    查看>>
    OWL本体语言
    查看>>
    P with Spacy:自定义文本分类管道
    查看>>
    P-DQN:离散-连续混合动作空间的独特算法
    查看>>
    P1035 I need help
    查看>>
    P1073 最优贸易
    查看>>
    P1364 医院设置
    查看>>
    P1865 A % B Problem
    查看>>
    P2260 [清华集训2012]模积和
    查看>>
    P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?
    查看>>
    P4313 文理分科
    查看>>
    SpringBoot中集成LiteFlow(轻量、快速、稳定可编排的组件式规则引擎)实现复杂业务解耦、动态编排、高可扩展
    查看>>
    SpringBoot中集成influxdb-java实现连接并操作Windows上安装配置的influxDB(时序数据库)
    查看>>
    P8738 [蓝桥杯 2020 国 C] 天干地支
    查看>>
    package,source folder,folder相互转换
    查看>>
    SpringBoot中集成Flyway实现数据库sql版本管理入门以及遇到的那些坑
    查看>>