• Windows 下动态链接库和静态链接库


    1.静态链接库:就是在编译的时候把库中代码复制进工程中,导致工程变大,但是速度快。

    缺点在于一套代码可能在内存中有多份拷贝,占用内存。

    2.动态链接库:库由windos api加载库代码,内存中只有一份拷贝。工程中只保留链接到这份代码的引用,有两种动态链接库,

      (a)load time dynamic linking:工程运行的时候自动加载,结束时自动卸载

      (b) run time dynamic linking: 在工程运行过程中通过调用LoadLibrary()和GetProcAddress()函数加载库函数,用FreeLibrary()函数卸载

    下面是实例:

    1. 静态库:

    通过vs创建win32的静态库,工程名为libTest,加入lib.h, lib.cpp

    #ifndef LIB_H
    #define LIB_H
    
    extern "C" int add(int x, int y);
    
    #endif
    #include "lib.h"
    
    int add(int x, int y)
    {
        return x+y;
    }

    代码简单,不解释。编译后生成libTest.lib文件。

    我们需要把.lib文件和lib.h文件拷贝到引用的工程中(或者可以把.lib文件通过配置link指定)

    新建工程进行引用:

    #include "lib.h"
    #pragma comment(lib, "testLib.lib");
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        printf("2+3= %d", add(2, 3));
        while(1) ;
        return 0;
    }

    关键是

    #pragma comment(lib, "testLib.lib");指令

    2.动态库:

    新建项目win32的dll,名字dllTest,加入3个文件,lib.cpp, lib.h, lib.def,代码如下:

    //dll.h
    #ifndef LIB_H
    #define LIB_H
    
    extern "C" int __declspec(dllexport) add(int x, int y);
    
    #endif
    
    
    //===================dll.cpp=======================
    #include "lib.h"
    
    int add(int x, int y)
    {
        return x+y;
    }
    
    //---------------------------------dll.def-----------------------------------
    LIBRARY dllTest2
    EXPORTS
    add @1

    .def文件表明了要导出哪些函数,导出的库名字。@后面是函数编号,前面是函数名字。

    编译后生成dllTest.lib, dllTest.dll,其中.lib文件用于load time dynamic linking,只是和静态库一样的调用方式,提供一个到dll的引用

    (1)run time dynamic linking(只要dll文件):

    #include <Windows.h>
    #include <stdio.h>
    
    typedef int (*lpAddfun)(int, int);
    //定义一个函数指针
    
    int main()
    {
        HINSTANCE hDll;  //dll的句柄
        lpAddfun addFun;    //函数指针变量
    
        hDll = LoadLibrary(TEXT("dllTest2.dll")); 
        if(hDll != NULL)
        {
            addFun = (lpAddfun)GetProcAddress(hDll, "add");
            if(addFun != NULL)
            {
                int result = addFun(2, 3);
                printf("%d", result);
            }
            FreeLibrary(hDll);
        }
        while(1);
        return 0;
    }

    (2)load time dynamic linking(既要.lib又要.dll)

    #pragma comment(lib,"dllTest.lib")
    
    extern "C" __declspec(dllimport) add(int x,int y);
    
    int main(int argc, char* argv[])
    {
        int result = add(2,3);
        printf("%d",result);
        return 0;
    }
  • 相关阅读:
    前端CSS部分简单整理
    前端HTML部分简单整理
    Top Android App使用的组件
    使用DialogFragment创建对话框总结
    Rails常用命令
    developer.android.com笔记
    Google Maps API v2 Demo Tutorial
    Android学习的一些问题
    Android学习过程
    Beginning Android 4 Programming Book学习
  • 原文地址:https://www.cnblogs.com/bubbler/p/5149770.html
Copyright © 2020-2023  润新知