静态库和共享库的简介及总结

制作库文件有什么用?

  • 不暴露源码
  • 不引入到代码

静态库

(1) 制作步骤

  • 编译为.o文件
  • .o文件打包:ar rcs libmylib.a file1.o file2.o ... (ar命令只能打包.o文件)
  • 将头文件与库一起发布

(2)使用

代码中包含头文件,编译时-L指定酷路径,-l 指定库名

(3)优缺点

  1. 优点
    - 执行快(加载到代码段了,不过快不了多少)
    - 发布应用时不需要发布库

  2. 缺点
    - 执行程序体积比较大
    - 库变更时需要重新编译应用

动态库

(1) 制作步骤

  • 编译与位置无关的代码,生成.o文件,关键参数-fPIC
  • .o文件打包: 关键参数-shared-o指定库名
  • 将库与头文件一起发布
假设我们用a.cb.c生成libMylib.so,则
gcc -fPIC -c  *.c   生成位置无关的.o文件
gcc -shared -o libMylib.so *.o  生成动态库

(2)使用

  • -L指定动态库路径, -l指定库名(与静态库一样,目的是保证ld连接器能够加载)
  gcc -o newapp main.c -L ./lib -lmylib -I ./include/
  • 如何解决程序运行时找不到动态库的问题
    (1)拷贝/链接到/lib或/usr/lib下(不推荐,太危险)
    (2) 将库路径增加到环境变量LD_LIBRARY_PATH
  export LD_LIBRARY_PATH=/home/usr/code/lib/:$LD_LIBRARY_PATH

(3)配置/etc/ld.so.conf文件,增加/home/usr/myCode/demo/lib路径,执行sudo ldconfig -v
(4)编译时候使用gcc的-Wl,-rpath选项指定运行时库的搜索路径

(3)优缺点

  1. 优点
    - 执行程序体积小
    - 库变更时一般不需要重新编译应用(库接口改了就得重新编译应用程序)

  2. 缺点
    - 执行时需要加载动态库,相对而言,比静态库满
    - 发布应用时需要同步发布动态库

小知识库

  1. Linux下bc命令可以调用计算器,quit命令退出
  2. nm命令查看二进制目标文件(.o文件、动态库、静态库、可执行文件)的符号表
  3. ldd命令打印可执行文件运行时所需的链接库

如果一个可执行二进制文件运行时提示找不到某某.so文件,就可以用ldd来看看这个二进制文件运行所需的链接库文件,然后再去看看LD_LIBRARY_PATH的值是否设置正确,去对应的lib目录下再去找找看.
ldd只能看linux下编译的可执行文件;看不了交叉编译的可执行文件

  1. 进程的内存空间模型
    进程的内存空间模型

参考文献

  1. Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH的区别

  2. ar nm ldd 静态库 动态库

  3. 进程的内存分布

  4. Makefile随笔(实战笔记,废话很少)

posted @   时间的风景  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
点击右上角即可分享
微信分享提示