• linux下的静态库和动态库


    一、linux下的静态库
      静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在!
     
    二、linux下动态库的构建和使用
    1、动态库的构建
       gcc  -fPIC  -shared    -o  lib库名.so   源文件列表
     
    例:
       gcc   -fPIC  -shared  -o  libmylib.so  max.c  min.c
     
    2、动态库使用
       gcc    -o  最终的可执行文件  源文件列表  -L 动态库的目录  -l库名
     
    例子:
    已经将int  getMax(int,int)和getMin(int,int)打包在了libmylib.so中了,现在你即可把libmylib.so复制希望用你的库函数的人了!!
     使用你的库函数的人可能回这样使用:
       //test.c
              int getMax(int,int);
              int main()
    {
    int x,y;
     int max;
    scanf(“%d%d”,&x,&y);
    max=getMax(x,y);//getMax是在你的库函数中已经实现了的,所以不用别人在实现了,直接拿来用就行了!!
    printf(“max=%d ”,max);
    return 0;
    }
     
    执行该命令:gcc  -o  test  test.c 会报错:提示找不到getMax;
    正确的命令:gcc  -o  test test.c  -L libmylib.so存放的目录   -lmylib
    错误的写法:gcc  -o  test test.c  -L libmylib.so存放的目录   -llibmylib.so
     
     
    查看动态库中的标号:
    readelf  -s  动态库名 
     
    查看可执行文件运行时所依赖的动态库:
    (1)ldd  可执行文件名
    (2)readelf  -d   可执行文件名|grep  Shared
     
    3、动态链接的可执行文件的运行(任选一种即可)):解决的是可执行文件在运行时找动态库
    (1)将动态库复制到/lib或/usr/lib目录下;(在嵌入式开发,推荐用此方法!)
         命令:
    正确:sudo  cp  libmylib.so  /lib/ 
    错误:sudo  cp  libmylib.so  /lib/mylib.so
    错误:sudo  cp  libmylib.so  /lib/libmylib
    (2)将动态所在目录路径添加到环境变量LD_LIBRARY_PATH
         例如:     
         export  LD_LIBRARY_PATH=动态库所在的目录:$LD_LIBRARY_PATH
         如果需要LD_LIBRARY_PATH一直生效,则需把上面的语句添加到~/.bashrc文件中末尾去。
         命令:
    gedit   ~/.bashrc
    偷懒的办法(慎用):
    echo  export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH>>~/.bashrc
    (3) 将动态所在的目录添加到/etc/ld.so.conf中,启动会自动加载/etc/ld.so.conf配文件,如果需要立即生效,执行命令:ldconfig
    命令:
    sudo gedit  /etc/ld.so.conf
     
    三、静态库、动态库使用上的区别
    静态库被调用的代码生成可执行文件时会被立即复制到执行性文件中去;
    动态库被调用的代码在可执行文件运行时才会被加载到可执行文件中去。
  • 相关阅读:
    iOS开发--UIPickerView(选择器控件) 省份和城市的做法
    UITableView左滑设置更多的按钮
    UITableView的增,删,改例子
    UITableView的简单用法
    Block传值原理
    UIToolbar的简单用法
    用UIScrollView,UIPageControl来实现滚动视图。
    用UIPickerView来显示省和市
    如何设计好的UI控件
    UITextfield属性用法
  • 原文地址:https://www.cnblogs.com/liangjf/p/7586589.html
Copyright © 2020-2023  润新知