zoukankan      html  css  js  c++  java
  • C_动态库|静态库

    动态库

    • 动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据

      • dll 并不是所有数据都能被访问到,必须要进行导出

    • 动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用

    • 生成动态链接库的时候会附带一个 lib,这个lib叫做导入库

      • 导入库同于提供导出函数和数据在 dll 中所处的位置,不提供代码

      • 如果使用隐式链接的方式使用动态链接库,必须要 dll 文件

    • 动态链接库的创建

    • //老师演示的时候是生成两个文件。一个header.h。一个.cpp。
      //自己复习的时候,创建完生成了4个文件:header.h targetver.h dllmain.cpp 动态库2.cpp
    • 方法一:声明导出

      1.创建动态库文件

      2.写文件信息

      3.运行。

    • DLL 程序的入口函数(了解),可写可不写的函数

    • (写在dllmain.cpp,函数定义也写在这)

      // DLL 程序的入口函数,会在不同的情况下被调用
      BOOL APIENTRY DllMain( HMODULE hModule,
                            DWORD  ul_reason_for_call,
                            LPVOID lpReserved
                          )
      {
         return TRUE;
      }
    • 函数的导出方式:使用声明进行导出

    • (写在header.h)

      • DLL 导出的函数不应该有名称粉碎,所以需要使用 extern "C" 取消名称粉碎

      #ifdef _USRDLL
      // 如果是 dll 表示我需要声明导出函数
      #define DLLAPI extern "C" _declspec(dllexport)
      #else
      // 如果是普通文件需要声明使用的是导入到当前程序的函数
      #define DLLAPI extern "C"_declspec(dllimport)
      #endif

      // 声明函数
      DLLAPI void show1();
      DLLAPI void show2();
      DLLAPI void show3();
    • 
      
      
    • 方法二函数的导出方式:使用模块定义问文件进行导出

      1.创建动态库文件

      2.写文件

      3.设置模板定义

      4.运行

    • (写在header.h)

      // 声明函数
      void show1();
      void show2();
      void show3();
      //直接声明函数,相比方法一,不需要DLLAPI宏定义声明来粉碎名称。
    • 新建一个文件,后缀名改def。名称随意。内容如下。

      • 模块定义文件自己会取消名称粉碎,推荐使用

      EXPORTS
      show1 @ 1
      show2 @ 2
      show3 @ 3
    • 动态链接库的使用方式

      • 显示的使用动态链接库

      // 2. 显示连接,依赖于一组API
      HMODULE hModule = LoadLibrary(L"../Debug/04. 动态库和静态库.dll");

      // 2.1 如果返回值非 0, 就获取函数
      if (hModule) fun = (pfun)GetProcAddress(hModule, "show1");

      // 2.2 如果函数非空,就调用函数
      if (fun) fun();
      • 隐式链接使用动态连接库

      // 1. 使用隐式链接的方式调用导出函数
      #include "../04. 动态库和静态库/framework.h"
      ////需要把生成的头文件拷贝到该文件下才能包含成功/////
      #pragma comment(lib, "../Debug/04. 动态库和静态库.lib")
      ////生成的动态lib文件,可以不在该文件目录下////

      // 1.1 调用隐式链接的函数
      show1();

    // 包含头文件是为了获取函数的声明

      
     

    #### 静态库

    - 静态库的创建



    - 静态库会生成一个 lib 文件,提供了所有的代码,又叫做**对象库**

    - (此处截图用的跟上面动态同一个文件,只是更改了生成方式)



    #### 静态链接库和动态链接库的区别

    - 使用 dll 的程序必须自带 dll,使用 lib 的程序可以不带 lib
    - 使用 dll 的程序通常比较小,使用 lib 的程序通常比较大
    - 使用 lib 的程序可以进行跨平台
    - 静态链接库的 lib 和 的动态链接库的 lib 不同,分别是对象库和导入库

    11

  • 相关阅读:
    httprunner-2-linux下搭建hrun(下)
    Docker学习3-简单shell脚本安装mysql5.7与docker小技巧
    功能测试--聊天功能测试&微信聊天
    Fiddler抓包3-查看get与post请求
    面向对象--继承
    Mybatis入门
    Maven基础
    Cookie&Session
    Redis应用
    Redis概念和安装
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10910272.html
Copyright © 2011-2022 走看看