Linux静态库和动态库


Linux静态库与动态库

生成静态库

// 默认生成对应的.o文件,注意c文件中不要把main函数包含进来
gcc .c文件 -c //例如:gcc test.c -c
    
// 将生成的.o文件打包,静态库的名称命名规则:lib + 库的名字 + .a
// 例如:静态库的名称可以为libtest.a、libmytest.a、libhaha.a
ar rcs + 静态库的名称 + 生成的.o文件 // 例如:ar rcs libtest.a test.o
    

使用静态库

// -L 指定静态库的目录
// -l 指定静态库目录中的哪个静态库,指定库时不能写前缀lib,也不能写后缀名.a
// -I 指定头文件
// -o 自定义生成可执行文件的名字
gcc main.c -I include -L lib -l mylib -o build

静态库的优点

  • 运行程序的时候不再需要对应的库
  • 运行程序快,因为对应的函数都被打包进了程序

静态库的缺点

  • 库被打包进程序中,导致可执行文件的大小变大
  • 当库更新之后,要使用该库必须重新编译程序

生成动态库

// 生成与位置无关的.o
// -I 指定头文件
gcc -fPIC -c .c文件 -I 头文件目录 // 例如:gcc -fPIC -c *.c -I include
// 将.o打包成动态库,动态库命名规则:lib + 库文件 +.so 
gcc -shared -o libmytest.so .o文件 -I 头文件目录 // 例如:gcc -shared -o libtest.so *.o -I include

共享库使用

// -L 指定静态库的目录
// -l 指定静态库目录中的哪个静态库,指定库时不能写前缀lib,也不能写后缀名.a
// -I 指定头文件
// -o 自定义生成可执行文件的名字
gcc main.c -I include -L lib -l mylib -o build
    
# 使用了动态库的可执行文件运行时都要链接库,必须告知库的位置
# 方法一:该方法是临时设置,设置LD_LIBRARY_PATH环境变量,程序运行时会查找LD_LIBRARY_PATH环境变量的值,能根据这个值来查找动态库
echo $LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径 #例如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/whn/mylib

# 方法二:设置用户目录下的bashrc配置文件,在最后一行加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径 #例如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/whn/mylib

# 方法三:修改动态链接器的配置文件,将动态库的路径写到配置文件中
sudo vi /etc/ld.so.conf

动态库优点

  • 执行程序的大小很小
  • 动态库更新之后,如果函数接口没有改变,不需要重新编译文件

动态库缺点

  • 执行程序时必须链接对应的库
  • 加载速度没有静态库快

文章作者: dyl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dyl !
 上一篇
shell shell
本文讲解shell脚本基本的语法,供博主学习复习,欢迎各位前来观看,该文来自博主在B站视频学习总结笔记,有一定参考价值
2023-12-10 dyl
下一篇 
动态规划 动态规划
动态规划在面试中经常出现,该文章来自于博主看B站视频总结,该文章总结了动态规划问题常见的特点与面对动态规划问题思考方式,对于新手来说简单易懂
2023-12-10 dyl
  目录