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

    你可能感兴趣的文章
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    OA系统多少钱?OA办公系统中的价格选型
    查看>>
    OA系统选型:选择好的工作流引擎
    查看>>
    OA项目之我的会议(查询)
    查看>>
    Object c将一个double值转换为时间格式
    查看>>
    object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    查看>>
    Object of type 'ndarray' is not JSON serializable
    查看>>
    Object Oriented Programming in JavaScript
    查看>>
    Object.keys()的详解和用法
    查看>>
    OBJECTIVE C (XCODE) 绘图功能简介(转载)
    查看>>
    Objective-C——判断对象等同性
    查看>>
    Objective-C之成魔之路【7-类、对象和方法】
    查看>>
    Objective-C享元模式(Flyweight)
    查看>>
    Objective-C以递归的方式实现二叉搜索树算法(附完整源码)
    查看>>
    Objective-C内存管理教程和原理剖析(三)
    查看>>
    Objective-C实现 Greedy Best First Search最佳优先搜索算法(附完整源码)
    查看>>
    Objective-C实现 jugglerSequence杂耍者序列算法 (附完整源码)
    查看>>
    Objective-C实现1000 位斐波那契数算法(附完整源码)
    查看>>