linux 动态库的制作和使用

1 制作第三方动态库的方法

  1. 使用gcc得到.o,得到和位置无关的代码。
gcc sub.c add.c div.c mult.c -c -fpic
  • -fpic/-fPIC: 使用相对地址记录代码的位置
  1. 使用gcc得到动态库
gcc -shared add.o sub.o div.o mult.o -o libcalc.so

或者:

gcc -shared -o libcalc.so add.o sub.o div.o mult.o


在这里插入图片描述

2 动态库的使用

gcc main.c -o app -I ./include/ -L ./ -lcalc
  • 这是只是保证在连接的时候没问题

在执行的时候如何定位共享文件的呢?

  • 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器(dynamic linker/loader)来获取该绝对路径。
  • 对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 —> 环境变量LD_LIBRARY_PATH —> /etc/ld.so.cache文件列表 —> /lib/,/usr/lib目录找到库文件后将其载入内存。

3 决加载动态库失败的问题

解决动态库找不到的问题:

第一种: 将动态库的绝对路径添加到 LD_LIBRARY_PATH 中

  1. 测试时候使用的, 终端关闭, 设置失效:
    在当前终端中执行: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/itcast/library
  2. 长久设置, 将export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/itcast/写到配置文件中
    • 用户级别: ~/.bashrc
      添加: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/itcast/library
    • 系统级别: /etc/profile
      添加: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/itcast/library
      添加完成执行命令, 使修改生效:
      . ~/.bashrc -> . 相当于 source
      . /etc/profile
      source /etc/profile

第二种: 在 /etc/ld.so.cache 添加动态库路径

需要间接完成这个操作:
1. 找一个文件: /etc/ld.so.conf
2. 执行一个命令, 进行更新: sudo ldconfig

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值