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 可执行文件

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章