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

    你可能感兴趣的文章
    notepad++正则表达式替换字符串详解
    查看>>
    notepad如何自动对齐_notepad++怎么自动排版
    查看>>
    Notes on Paul Irish's "Things I learned from the jQuery source" casts
    查看>>
    Notification 使用详解(很全
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    NotImplementedError: Could not run torchvision::nms
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! fatal: unable to connect to github.com:
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>