Linux学习总结(六)静态库和动态库的制作

静态库制作

命名格式:

1.以lib开头
2.静态库名
3.a结尾
例如:libsort.a

优点:

  • 寻址方便,速度快
  • 库被打包到可执行程序中,直接发布可执行程序即可使用

缺点:

  • 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
  • 如果静态函数库改变了,那么你的程序必须重新编译

使用场合:

  • 在核心程序上使用,保证速度,可忽视空间
  • 主流应用于80、90年代,现在很少用

制作

1、得到*.o:gcc a.c b.c c.c -c
2、得到静态库libmytest.a

ar rcs libmytest.a a.o b.o c.o(就是一个打包.o文件的过程)
查看库中的符号(函数、全局变量等):nm libmytest.a

使用静态库

gcc + 源文件 + -L静态库路径 + -l静态库名 + -l头文件目录 + -o 可执行文件名
例如:gcc main.c -L./ -lmytest -l./ -o app

  • -L:指定库所在路径
  • -l:指定库的名字,去掉前缀lib,去掉后缀.a,只留下中间部分
  • -l:头文件目录位置

动态库制作

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
优点:

  • 节省内存(共享)
  • 易于更新(动态链接):停止运行程序,使用新库覆盖旧库(保证新旧库名称一致,接口一致),重新启动程序

缺点:

  • 延时绑定,速度略慢

使用场合:对速度要求不是很强烈的地方都应使用动态库
注意事项:冬天库是否加载到内存,取决于程序是否运行
命名格式:

1.lib开头
2.动态库名
2.so结尾
例如:libmytest.so

制作

1、生成“与位置无关”的目标文件

gcc -fPIC a.c b.c c.c -c

2、制作动态库

gcc -shared -o libmytest.so a.o b.o c.o
-shared:制作动态库
-o:重命名生成的新文件

3、使用动态库

gcc main.c -L./ -lmytest -l./ -o app
-L:指定库所在的路径
去掉前缀lib,去掉后缀so,只留下中间部分
-I:头文件目录位置

4、执行生成的可执行文件
./app可能运行失败原因:
查看依赖的共享库:ldd app,发现libmytest找不到,原因是没有给动态链接器(ld-linux.so.2)制定好动态库libmytest.so的路径
解决方案:

  • 临时设置:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效了。
  • 永久设置:将上条写入家目录下.bashrc文件中
  • 粗暴设置:直接将libmytest.so文件拷贝到/usr/lib/目录下
  • 将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v更新

LD_LIBRARY_PATH:

作用:指定查找共享库(动态链接库)时除了默认路径之外的其它路径,该路径在默认路径之前查找
设置方法:用export命令来设置值

猜你喜欢

转载自blog.csdn.net/bureau123/article/details/111773616
今日推荐