zoukankan      html  css  js  c++  java
  • C++中静态链接库与动态链接库的介绍与使用

    C++中静态链接库与动态链接库的介绍与使用
    一,简介
    1.静态库
    函数与数据被编译进一个二进制文件(通常扩展名为.lib),在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们
    和应用程序的其他模块组合起来创建最终的可执行文件(.EXE),当发布产品时,只需要发布这个可执行文件,并不需要发布使用了的静态库
    2.动态库
    在使用动态库的时候,往往需要提供两个文件:一个引入库文件(.lib)和一个DLL(.dll)文件,虽然引入库的文件后缀也是.lib,但是动态库的引入库文件
    和静态库有着本质上的区别,对于一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据,当
    使用动态库的时候,编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行文件运行
    时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数,在发布产品时,除了可执行程序以外,同时还要发布该程序将要
    调用的动态链接库。

    二,动态链接库的加载与使用
    1.创建动态链接库
    注意:创建的是空的win32 DLL 项目
    //calc.cpp
    int add(int a,int b)
    {
    return a+b;
    }
    int sub(int a,int b)
    {
    return a-b;
    }
    编译生成之后,会在项目路径中的Debug目录下发现calc.dll,但是我们会发现找不到前面提到的很重要的一项引入库文件calc.lib,这是为什么?这里我们
    就需要使用Visual Studio 2010 中的一项功能:dumpbin命令。dumpbin命令是在visual studio 2010 中bin中的一个命令,我们可以先进入vs 命令提示符
    工具->vs 2010 命令提示符,然后使用命令 dumpbin -exports (.dll 路径),例如我的就是:dumpbin -exports E:VS_ProjectcalcDebugcalc.dll,然后发现
    这里面显示的信息并没有我们的这两个函数,原因是因为:我们需要使用的dll文件中的函数都必须是导出的,好的,那么我们再重新更改一下calc.cpp源文件:
    //calc.cpp(修改版)

    _declspec(dllexport)  int add(int a,int b)
    {
    return a+b;
    }

    _declspec(dllexport)  int sub(int a,int b)
    {
    return a-b;
    }
    再次的我们编译生成,到debug目录下,我们会发现我们需要的calc.lib引导库文件找到了,再次的我们敲下 dumpbin命令,我们会发现,多出了两行关于函数信息
    编号分别为1和2,不过函数名是不是有点费解呢?有兴趣的话可以去了解一下。这样,我们就得到了我们需要的dll以及其引导库文件lib

    2.动态链接库的加载

    首先我们新建一个测试程序testdll,添加源代码test.cpp如下:
    //test.cpp
    #include<iostream>

    using namespace std;

    extern int add(int a,int b);
    extern int sub(int a,int b);

    int  main()
    {
        cout<<add(1,2)<<endl;
        cout<<sub(2,3)<<endl;
        system("pause");
    return 0;
    }

    注意:我们在使用动态链接库时,首先要配置好环境变量,在使用函数时先声明,再使用,如何配置呢?其实很简单,主要目的就是系统能找到该dll,怎么做呢?
    方法有很多,这里介绍一个最简单的一种:首先将生成的calc.dll和calc.lib复制到测试程序也即需要使用该dll的项目文件夹下,然后将项目属性中链接器中的输入
    里面有个附加依赖项中添加calc.lib,也即添加引导库文件,就这样配置好了。

    最后编译运行


  • 相关阅读:
    Redis之分布式锁的使用
    Redis之lua脚本
    Redis 集群的水平扩缩容
    Redis集群搭建及原理
    Redis 的主从、哨兵架构
    CompletableFuture 使用介绍
    Spring Boot 2.x使用H2数据
    pom.xml
    nexus-staging-maven-plugin 踩坑
    安卓Hook折腾研究的笔记记录
  • 原文地址:https://www.cnblogs.com/ainima/p/6331143.html
Copyright © 2011-2022 走看看