zoukankan      html  css  js  c++  java
  • 动态链接库和静态链接库的区别

    两种库

    1. 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
    2. 一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。

    (所以无论是动态链接库还是静态链接库,都会有lib文件)

    两种链接方式

    动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL中函数的可执行代码所需的信息。
    静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。

    静态链接库的使用:

    • 需要的文件: 头文件 .h 、静态库 .lib
    • 头文件.h中有函数的声明,使用静态链接库的项目需要引用该文件才能编译通过
    • .lib包含了实际执行代码、符号表等等
    • 加载lib的方法:  法1.使用编译链接参数或者VS的配置属性来设置    法2.使用pragma编译语句,例如pragma comment(lib,"a.lib")
    • .lib中的指令将全部被直接包含在最终生成的 EXE 文件中

    动态链接库的使用:

    一、动态库的隐示调用:

    • 需要的文件: 头文件 .h 、动态链接库的.lib文件,动态链接库的dll文件
    • 头文件.h和静态链接库使用时的作用一样,使用动态链接库中的函数的项目需要引用该文件才能编译通过
    • .lib包含了函数所在的DLL文件和文件中函数位置的信息,.dll包含了实际执行代码、符号表等等
    • 加载lib的方法:lib是编译链接是用的,跟使用静态链接库时一样有两种方法:法1.使用编译链接参数或者VS的配置属性来设置    法2.使用pragma编译语句,例如pragma comment(lib,"a.lib")
    • 加载dll的方法:dll是运行时用的,链接了lib之后形成的EXE可执行文件中已经有了dll的信息,所以只要把dll放在和exe同一个目录下就可以了,运行时根据EXE需要自动加载dll中的函数

    二、动态库的显式调用:

    • 需要的文件: 动态链接库的dll文件
    • 不需要.h头文件和.lib文件,因为LoadLibrary之后可以使用getProcAddress来查找一个函数的地址从而调用该函数 (显式调用的前提是使用者需要知道想调用的函数的名字、参数、返回值信息,也就是说虽然编译链接用不上.h头文件,但是调用者编程时可能还是要看.h文件作参考来知道函数名字、参数、返回值信息)

    显式调用动态库步骤:

    1、创建一个函数指针,其指针数据类型要与调用的 DLL 引出函数相吻合。
    2、通过 Win32 API 函数LoadLibrary()显式的调用DLL,此函数返回DLL 的实例句柄。
    3、通过 Win32 API 函数GetProcAddress()获取要调用的DLL 的函数地址,把结果赋给自定义函数的指针类型。
    4、使用函数指针来调用 DLL 函数。

    5、最后调用完成后,通过 Win32 API 函数FreeLibrary()释放DLL 函数。
     

    最后,特别说明下载使用C#显式调用dll时会更加简单,如下:

    [DLLImport(“DLL文件”)]

    修饰符 extern 返回变量类型 方法名称 (参数列表)

    描述如下:

    DLL文件:包含定义外部方法的库文件。

    修饰符: 访问修饰符,除了abstract以外在声明方法时可以使用的修饰符。

    返回变量类型:在DLL文件中你需调用方法的返回变量类型。

    方法名称:在DLL文件中你需调用方法的名称。

    参数列表:在DLL文件中你需调用方法的列表。
    --------------------- 

    原文:https://blog.csdn.net/wqfhenanxc/article/details/80496522 
     

  • 相关阅读:
    B 合约数
    Weekly Contest 80
    第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛
    2018年长沙理工大学第十三届程序设计竞赛
    通过 DDNS 解决宽带拨号 ip 变化问题
    frp 内网穿透的使用 和原理
    笔记本centos 取消 关闭盖子自动挂起
    centos7 pptp 安装
    linux 命令收集
    centos7 关闭防护墙
  • 原文地址:https://www.cnblogs.com/oneDongHua/p/14264073.html
Copyright © 2011-2022 走看看