• C语言中静态库和动态库笔记


      库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用。

    程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用,

    其过程具有一定的模块化、封装、抽象的特征。

      按照库的使用方式, 静态库 和 动态库。

    不管怎样方式使用, 首先库的概念体现出代码逻辑上公共抽象。

       有篇博文,做了介绍, 并有例子, 本文纯粹学习,借鉴了其中的例子。

    http://www.cnblogs.com/chio/archive/2007/11/03/948480.html

    静态库

      静态库,编译应用程序的过程中, 就将代码编译进去引用程序,

    使用上, 只要引用库的开放头文件, 在应用代码中就像引用应用自己的函数一样。  

    对于这种库,

    linux编译的后缀为 .a (archive, 从命名上可以看出,仅仅是归档的作用, 跟文件夹和若干相关的文件关系类似)  

    windows为.lib (library)

    动态库

      动态库,在编译阶段,没有将库文件编译进入应用,

    而是在执行阶段,将动态库加载到内存打开,按照函数名找到函数后执行, 

    在应用编码中, 使用特有的动态库接口来 打开库, 找函数, 关闭库等,具体接口跟平台有关:

    windows : http://msdn.microsoft.com/en-us/library/ms682599(v=vs.85).aspx

    Linux:http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/index.html

      windows编译动态库文件的后缀为 .dll (dynamic library Linker)

      Linux的动态库文件为.so (shared object  = 从使用场景给了最好的解释, 首先是executable object, 然后各个程序都可以执行阶段动态分享 shared)

      与静态库相比,

    (1)动态库更加省内存,只在需要的时候加载。

    (2)省空间,如果多个程序引用, 只有一份目标文件大小, 静态库是各个应用都编译进去。

    (3)使用方式更加灵活,可以对库更加灵活替换或者升级。  

    所以对于本地应用开发, 系统都提供了一些本地应用库,给开发者使用,例如c库 libc.so。

    实验 -- 静态库

      本实验使用C-FREE作为编译开发运行环境。 C-FREE DOWNLOAD ADDRESS http://www.programarts.com/cfree_ch/index.htm

    做一个加法计算的动态库,然后由应用调用。

    静态库-libStatic.a

    addFuncLib.cpp

    #include "addFuncLib.h"
    int add(int x,int y)
    {
        return x + y;
    }

    addFuncLib.h

    #ifndef LIB_H
    #define LIB_H
    extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数
    #endif

    应用 编译时候,需要将libStatic.a添加到此工程。

    callAddFunc.cpp

    #include <stdio.h>
    #include ".\addFuncLib.h"
    int main(int argc, char* argv[])
    {
        printf( "2 + 3 = %d", add( 2, 3 ) );
    }

    实验 -- 动态库

      环境和实例与静态库一致。

    动态库-libShared.dll

    addFuncLib.cpp

    #include ".\addFuncLib.h"
    int add(int x,int y)
    {
        return x + y;
    }

    addFuncLib.h

    #ifndef LIB_H
    #define LIB_H
    extern "C" int __declspec(dllexport)add(int x, int y);
    #endif

    应用 运行前,需要将ibShared.dll添加到此目标文件路径。

    callAddFunc.cpp

    #include <stdio.h>
    #include <windows.h>
    
    typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
    
    int main(int argc, char *argv[])
    {
        HINSTANCE hDll; //DLL句柄 
        lpAddFun addFun; //函数指针
        hDll = LoadLibrary(".\libShared.dll");
        if (hDll != NULL)
        {
            addFun = (lpAddFun)GetProcAddress(hDll, "add");
            if (addFun != NULL)
            {
                int result = addFun(2, 3);
                printf("dll calling add func with arg 2 3 =%d", result);
            }
            FreeLibrary(hDll);
        }
        return 0;
    }
  • 相关阅读:
    [BZOJ5338][TJOI2018]xor(可持久化Trie)
    [BZOJ4592][SHOI2015]脑洞治疗仪(线段树)
    [BZOJ4571][SCOI2016]美味(贪心+主席树)
    [BZOJ4570][SCOI2016]妖怪(凸包)
    [BZOJ4569][SCOI2016]萌萌哒(倍增+并查集)
    [BZOJ4567][SCOI2016]背单词(Trie+贪心)
    [BZOJ4565][HAOI2016]字符合并(区间状压DP)
    [BZOJ4561][JLOI2016]圆的异或并(扫描线)
    [BZOJ2650]积木
    [清橙A1210]光棱坦克
  • 原文地址:https://www.cnblogs.com/lightsong/p/3813453.html
Copyright © 2020-2023  润新知