扩展:

  linux gcc命令

  1. 描述:
    a. 动态库也叫共享库
    b. 动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。
    c. 可以实现进程之间的资源共享。
    d. 将一些程序升级变得简单。
    e. 甚至可以真正做到链接载入完全由程序员在程序代码中控制。
    f. 动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”。
    g. windows共享库是以 .dll 为后缀的文件。
  2. 特点:
    a. 在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,系统会在动态库环境变量所指定的目录下去找对应名字的动态库。
    b. 在程序运行时还需要动态库存在,
    c. 代码体积较小
    d. 不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
  3. 创建动态库(测试例程在结尾):
    a. 将库源文件编译成.o的目标文件–> gcc -c mylib.c -o mylib.o //将.c文件生成.o文件
    b. 将.o文件制作成动态库文件 --> gcc [-shared] -fPIC -o libmylib.so mylib.o //这里的-shared是默认的,不写也可以 ;-fPIC 创建与地址无关的编译程序
    c. 编译test.c 同时链接制作的动态库 --> gcc -o test test.c -L. -lmylib // -L库的路径 -l库名
  4. 使用ldd命令查看可执行程序所依赖的动态库:
    可以看到libmylib.so动态库没有找到,需要配置该动态库的路径。
      
  5. 配置该动态库路径位置路径 :
    动态库默认路径为/lib 或者 /usr/lib,有以下方法配置。
    a. 方法1:将libmylib.so动态库放到/lib 或者 /usr/lib目录下。
    b. 方法2:将动态库所在的路径加入配置文件: /etc/ld.so.conf 的后面,如下:
     打开文件: sudo vim /etc/ld.so.conf
     使用pwd命令查看当前libmylib.so动态库所在的路径
      
     ld.so.conf文件里添加libmylib.so动态库的路径,如下一行:
       /media/sf_VirtualBox_share/库的制作
      
     运行动态链接库管理命令:sudo ldconfig
    c. 方法3:将动态库所在的路径临时加入到环境变量中: LD_LIBRARY_PATH
      执行下面的命令:
      export LD_LIBRARY_PATH=./
      ./表示将当前路径临时加入到环境变量中,也就是这个路径–>
         /media/sf_VirtualBox_share/库的制作
      注意: 这个方法只对当前使用的shell终端有效。
  6. 再次使用ldd命令查看可执行文件所依赖的动态库
    可以看到libmylib.so库找到了。
      
  7. 注意:
      将程序与动态库建立关系时,-L参数用于指定动态库的具体路径。-L.表示所要链接的库在当前目录下。而建立链接后需要把动态库放到指定的位置,这样在可执行程序运行时能正确加载动态库。
  8. ldconfig命令
      ldconfig 命令的用途,主要是在默认搜寻目录 (/lib和/usr/lib) 以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库,进而创建出动态装入程序 (ld.so) 所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。
  9. 动态库与静态库混合连接
       如果只使用–shared(默认选项)会造成所有的库都使用动态链接的方式。这时候需要使用 - Wl,option将option作为一个选项传递给链接器,链接器就可以让后面的库进行不同方式的链接。比如 gcc -L. -o test test.c -Wl,-Bstatic -lmystaticlib -Wl,-Bdynamic -lmysharelib。这里需要保证动态链接放在后面,以让动态库(如标准库)能在默认的共享库路径去寻找共享库。也可以写成 gcc -L. -o test test.c -Wl,-Bdynamic -lmysharelib -Wl,-Bstatic -lmystaticlib -Wl,-Bdynamic。
  10. 测试例程:
    mylib.c 文件
     int myplus(int a,int b);int mysub(int a,int b);int myplus(int a,int b){return a + b;}int mysub(int a,int b){return a - b;}

   test.c 文件

 #include <stdio.h>int myplus(int a,int b);extern int mysub(int a,int b);extern int main(void){int a,b;printf("请输入a和b:");scanf("%d%d",&a,&b);printf("%d + %d = %d\n",a,b,myplus(a,b));printf("%d - %d = %d\n",a,b,mysub(a,b));return 0;}
参考:

  ldconfig及LD_LIBRARY_PATH

动态库(.so)的制作相关推荐

  1. 静态库.a和动态库.so的制作

    静态库 gcc add.c -o add.o -c ar rcs libadd.a add.o gcc main.c libadd.a -o main./main 动态库 gcc add.c -o a ...

  2. 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用

    如有错误,欢迎大家指正,感谢! ​​​​​​​目录 一.程序工作过程简单介绍 1. 安装GCC 2. 源程序工作流程 3. 使用示例 4. gcc常用的编译参数选项 二.静态库的制作及使用 1. 库是 ...

  3. 动态库和静态库的创建

    库:一组别人实现好的函数接口 1.命名方法  静态库 : libname.a  动态库 : libname.so  注意   :库的名字是name  2.链接动态库和静态库的区别  预处理,编译,汇编 ...

  4. Linux静态库和动态库的设计

    静态库和动态库的设计 宗旨:技术的学习是有限的,分享的精神是无限的. Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供 Linux应用程序使用的主要函数库均存放于/lib, /usr ...

  5. Linux编程(5)_静态库与动态库

    1 库是什么 假如你写了一个perfect的项目, 有公司想要购买的你的源代码, 此时你肯定不想把你的源代码就这么给别人, 你只想让别人使用就够了. 那么你可以把的源代码生成为.o二进制文件, 封装成 ...

  6. bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解

    Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...

  7. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  8. bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库

    引言 前面我们讲解了什么是函数库(函数库就是一些事先写好的函数集合),函数库有什么作用(可以打包我们的编写的源代码,供他人使用,同时源码不可见,保护了自己的知识产权)以及函数库有2种提供方式:静态链接 ...

  9. Linux下的vim编辑器与gcc编译器及静动态库的制作

    1.vim编辑器的使用: (1)vim的三种模式: 命令模式:打开文件默认进入命令模式 编辑模式:需要输入一些命令切换到编辑模式 末行模式:在末行模式可以输入一些命令 命令模式aios和AIOS都可以 ...

最新文章

  1. Diomidis Spinellis:有效的调试
  2. 中国新十大军工企业名单及简称 十大军工集团 原十大军工集团
  3. 史上最全的Chrome使用技巧集锦
  4. 【图文并茂】DEV配置NTL库
  5. POJ2195 Going Home 最小费用最大流
  6. boost::core::typeinfo的用法实例
  7. 【爬虫】beautiful soup笔记(待填坑)
  8. python之torchlight使用_python游戏编程之pgzero使用介绍
  9. 做「容量预估」可没有true和false
  10. oracle捕捉所有异常,如何捕获和处理特定的Oracle异常?
  11. 如何完整卸载wxpython_TextCtrl的WXPython C++部分被删除
  12. 将x86平台的Linux控制台重定向到串口
  13. script标签的for属性和event属性
  14. 个人地理数据库与文件地理数据库的区别
  15. uandroidtool使用教程_apktool反编译详细使用教程_图文教程
  16. 软件开发外包平台有哪些?收集的一些备用
  17. 类似igoogle div拖拽 demo
  18. 3D中的OBJ文件格式详解(转)
  19. 石门一中2021年高考成绩查询,石门一中火了!2020年高考成绩再次刷新记录
  20. Android应用启动之从Launcher拉起APP(三)

热门文章

  1. Windows 8系统关机的十个方法!推荐收藏!
  2. 隧檤断面超欠挖放样步骤(5800)
  3. E. Sending a Sequence Over the Network(DP)
  4. ABAQUS学习(2D-XFEM)
  5. H3C交换机telnet服务三种认证模式配置
  6. 男人绝对不能冒犯的女人死穴
  7. 【基础】在css中绘制三角形及相关应用
  8. iOS 2019 最新面试题集锦
  9. java 强制类型转换
  10. watch gt 鸿蒙,鸿蒙登陆第三站:第一枚Harmony手表亮相?华为Watch GT 2e首发