linux系统--静态库/共享库(动态库)


总纲

1基本概念

1作用

  • 分离编译
  • 代码重用

2动态库和静态库的区别

  • 静态库:
    • 在可执行程序运行前就加入到执行码中,成为执行程序的一部分
    • 一个或多个.o目标文件归档在一个文件中
    • 对空间要求较低,而对时间要求较高的核心程序中
      在这里插入图片描述
  • 动态库:
    • 在可执行程序运行启动时加入到执行程序中,可以被多个可执行程序共享使用
    • 没有main函数的可执行文件
    • 对时间要求较低,而对空间要求较高的
      在这里插入图片描述

静态库:
优点是,在编译后的执行程序不再需要外部的函数库支持,运行速度相对快些;
缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。
动态库 :
优点是,动态库的改变并不影响你的程序,所以动态函数库升级比较方便;
缺点是,因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。

2静态库的制作

2.1创建

  • 编译源文件:生成静态库的材料
g++ -c -o test.o test.cpp
  • 生成静态库
ar -rcs libtest.a test.o //libtest.a是动态库的名字
命令选项作用
r替换模块(replace)
c创建库(create)
s建立索引

在这里插入图片描述

2.2使用

  • 注意:库一定要放在命令行的末尾

    • 链接静态库
g++ -o main main.cpp -L. -l库民
g++ -o main main.cpp ./lib库名.a

在这里插入图片描述

2.3函数的隐士声明

  • 返回值类型只有int型,
  • 错误出现(因为该文件编译时还没有连接库,所以发现不了这些文函数,所以在文件中隐士声明了这些函数)
    在这里插入图片描述
  • 解决方法:头文件加声明

2.4tar和ar都是归档工具

  • tar用于创建.tar归档文件。
  • ar用于创建归档文件,并且为归档的目标文件中的符号建立索引。

3动态库制作及使用

3.1创建

  • 编译目标文件:生成制作动态库的材料
g++/gcc -c test.cpp -o test.o -fPIC //(生成与位置无关的代码 -fPIC)
  • 生成动态库
g++/gcc -shared lib库名.so text.o

在这里插入图片描述

3.2使用

  • 编译可执行程序时,指定所使用的动态库。-l:库名 -L:指定库路径
gcc text.c -o a.out -lmymath -L./lib
  1. 运行可执行文件 ./a.out
    在这里插入图片描述

4动态库加载错误愿因和结局方法

  • 运行可执行文件 ./a.out:但是会出错可是我给了位置和库名,为什么还会出错?:因为动态链器器提供动态库所在目录位置,但是只会在固定目录寻找动态库,如果找不到就报错。
    在这里插入图片描述
    • 原因 (动态链接器报错)
      • 链接器:工作于链接状态,工作需要-l 和 -L
      • 动态链接器: 工作于程序运行时间。工作的时候需要提供动态库所在目录位置。
    • 改正方法
      • 临时生效
        • 改变环境变量export LD_LIBRARY_PATH=./lib( 终端重启环境变量实失效)
      • 永久生效方法1:
        • vim ~./bashrc(环境变量的配置文件)
        • 写入 export LD_LIBRARYPATH=动态库路径
        • …bashrc/ source.bashrc /重启 终端
      • 永久生效方法2:
        • 拷贝自定义动态库 到/lib(标准C库所在目录中)
      • 永久生效方法3:
        • vim /etc/ld.so.conf
        • 写入动态库绝对路径保存
        • sudo ldconfig -v使配置文件生效
        • ./a.out 成功

5注意点

  1. 当静态库和动态库同名时, gcc命令将优先使用动态库。
  2. 查看执行文件链接的动态链接库
ldd 可执行文件

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值