zoukankan      html  css  js  c++  java
  • 静态/动态函数库设计,王明学learn

                  静态/动态函数库设计

    Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供。

    两者区别:

    一、函数库分类

    函数库按照链接方式可分为:

    1.静态链接库

      对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件 (executable file)。程序 在运行 时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件 名为“libxxx.a”的形式。

      特点:程序所要用到的库函数代码在链接时全部被copy到程序中。

      缺点:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费。

    2. 动态链接库

      把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是动态链接库(dynamic link library)技术。

    二、函数库存放位置

      Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库。

    2.1静态库-编译选项

      1.Linux下进行链接时默认是链接动态库

      2.如果需要使用静态库,需要使用编译选项  -static

    例:gcc –static test.c -o test

    2.2制作静态库

      1. gcc –c mylib.c –o mylib.o

      2. ar cqs libmylib.a mylib.o

    表示:

    (1) 生成静态库的文件名是 libmylib.a

    (2) c 表示无提示模式创建文件包

    (3) q 表示在文件包尾加入 mylib.o

    (4) s 强制重新生成文件包的符号表

      3. 将制作好的libmylib.a 复制到/usr/lib

    2.3使用静态库-编译选项

    -lname:

      GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。

    例:gcc test.c –lmylib -o test

      函数库命名时一般以lib开头libmylib.a但是使用-l链接时却不用加lib而是知己使用-lname

    三、动态链接函数库

    制作动态链接库:

        1. gcc –c –fPIC mylib.c –o  mylib.o  //这里一定要加上-fPIC选项,不然下一步编译失败

        2. gcc -shared –fPIC  mylib.o -o libmylib.so

      3. 将制作好的libmylib.so 复制到/usr/lib

    -fpic 使输出的对象模块是按照可重定位地址方式生成的。-shared 指明产生动态链接库。

     如果库是移植使用一定要注意使用和编译的时候系统位数一致,并且包含头文件定义要使用库的函数原型.在使用过程中将库复制到/usr/lib目录下面然后在编译可运行程序是-lmylib(-l是小写的L)就可,这里没有.so后缀。

    如果将自己编译的.so文件存放到了其他的目录下面则可以通过-L来指定链接动态库的路径。比如gcc  wmx.c  -o  wmx  -L ./ -lmylib (动态库在当前目录下)

  • 相关阅读:
    前端模板引擎编译
    h5与app混合开发,jsbridge
    vuex
    async await promise
    node端口被占用
    npm工作流 与webpack 分同环境配置
    GraphQL
    mybatis批量删除、插入
    Oracle数据库速查知识文档
    Oracle刷新物化视图
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5301761.html
Copyright © 2011-2022 走看看