zoukankan      html  css  js  c++  java
  • 如何创建动态库

    静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。

    而依赖动态库的程序其实也有链接动态库的阶段,只不过这个链接并不是真正的将动态库链接到程序中,其目的是告诉程序,所依赖的到底是哪个动态库。

    静态库有点类似于将静态库复制到程序中,而动态库是在程序中创建一个软连接。

    比如:

    //a.c  主程序源代码
    #include <stdio.h>
    #include "b.h"
    main(){
    bb();
    }
    
    //b.h 主程序依赖b库,b库的头文件是b.h
    int a;
    void bb(void);
    
    //b.c b库源代码
    #include <stdio.h>
    #include "b.h"
    int a=7;
    void bb(){
    printf("das%d
    ",a);
    }

    首先生成动态库:

           第一步:生成b.o目标文件,使用如下命令。在此处需要添加-fPIC参数,该参数用于生成位置无关代码已工生成动态库使用,使用命令:gcc -c -o b.o -fPIC b.c

      第二步:使用-shared参数生成动态库,使用如下命令:gcc -shared -o libb.so b.o,

           不过上述两部可以连在一起,:gcc -shared -fPIC -o libb.so b.c

    接下来就是将程序文件a.c链接动态库生成二进制可执行程序的过程了,这里有很多方法:

    方法一:如果将libb.so移动到/lib64;/usr/lib64;这两个任意目录下,直接用命令gcc -o a a.c -lb,则链接成功,

    但是不提倡用这个方法,因为是我们自己编写的库文件,/lib;/usr/lib64这两个文件夹下都是些系统的库文件,所以还是不要碰这两个文件夹了

    方法二:我们先在本地目录下生成动态库文件,然后将本目录加入到系统搜索动态库文件的环境变量LD_LIBRARY_PATH中(export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH)(事实上动态库的环境变量不只这一个,还有LD_PRELOAD,详见其他博客),然后再执行gcc -o a a.c -L. -lb

    方法三,指定动态文件的位置,比如gcc -o a a.c /root/libb.so;gcc -o a a.c ./libb.so

    一旦指定了动态文件的位置,动态文件将不能移动。以下通过gcc -o a a.c ./libb.so举例(我本人推荐此方法):

    gcc -o a a.c ./libb.so

    在方法三中,链接时已经明确了动态库的位置,所以如果移动动态库,甚至将动态库移动至/lib64目录下,或者将主程序a移动至其他目录,都将导致程序运行失败,只要保证动态库与可执行程序保持在同一文件夹下才有效

  • 相关阅读:
    根据屏幕大小,加载不同大小的图片
    规范命名CSS
    iframe框架加载完成后执行函数
    js获取IP地址
    80端口被System占用 造成Apache不能启动的解方案
    自定义一个仿Spinner
    让你的代码量减少3倍!使用kotlin开发Android(一)
    屏幕适配
    一个旋转菜单
    手势监听GestureDetector 案例
  • 原文地址:https://www.cnblogs.com/saolv/p/9653286.html
Copyright © 2011-2022 走看看