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

    你可能感兴趣的文章
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>