linux静态库、动态库

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)

动态函数库同共享函数库是一个东西(在linux上叫共享对象库,文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)

img

静态函数库:在程序执行前(编译)就加入到目标程序中去了 ;

优点:编译后的执行程序不在需要外部的函数支持,运行速度相对快些,移植方便

缺点:程序太大,链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝,更新、部署、发布麻烦

动态函数库:在程序执行时动态(临时)由目标程序去调用;

优点:程序小而简洁,链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序可以共用,节省内存。 动态库升级简单,只需要替换库文件,无需重新编译应用程序

缺点:加载速度比静态库慢,程序运行需要提供依赖的动态库

静态库的生成和使用

ar是一种常用的Unix/Linux命令,用于创建、修改和提取归档文件(archive files),通常被称为静态库(static library)。

 ar [参数选项] [归档文件名] [目标文件列表]
  • c:创建归档文件

  • r:向归档文件中添加目标文件

  • d:从归档文件中删除目标文件

  • t:列出归档文件中包含的目标文件列表

  • x:从归档文件中提取目标文件

静态库的制作:格式xxx.a

  • gcc text.c -c 生成xxx.o文件

  • ar rcs libtext.a text.o xxx.o文件生成xxx.a静态库文件
    其中,选项-rc用于创建归档文件并向其添加目标文件,选项-s用于将符号表添加到归档文件中以便在链接时使用。

  • 要查看静态库中包含的目标文件列表,可以使用以下命令:

    ar -t libtest.a

    要从静态库中提取一个目标文件,可以使用以下命令:

    ar -x libtest.a test1.o

    这将提取libtest.a中的test1.o文件并将其保存到当前工作目录中。

动态库的制作:xxx.so

 gcc -shared -fpic text.c -o libtext.so

当使用 gcc -shared -fpic 命令编译代码时,会生成一个共享对象文件(.so 文件),该文件可以被其他程序动态链接使用。下面是关于 gcc -shared -fpic 的一些信息:

  • -shared 选项告诉编译器生成一个共享对象文件,而不是可执行文件。

  • -fpic 选项告诉编译器生成位置无关代码(Position Independent Code,PIC),这样代码可以在内存中的任何位置执行。这是为了支持动态链接,因为共享对象文件可以在不同的内存地址加载。

  • gcc -shared -fpic 命令通常用于将多个源文件编译为一个共享库,这样其他程序可以链接并使用该库中的函数和变量。

库的使用:

静态库:

 gcc textX.c -ltext -L ./ -o main  //最后只需要留下一个.a文件和.h文件即可
  • -ltext -l是指定要用的动态库,库名砍头去尾

  • -L告诉gcc编译器从-L指定的路径去找静态库(这里指定的是当前目录./)。默认是从/usr/lib 或者/usr/local/lib去找

动态库:

(14条消息) Linux库之动态库和静态库、Linux指定动态库的位置linux 指定动态库链接位置Love小羽的博客-CSDN博客

 gcc textE.c -ltext -L ./ -o mains
 ​
 ==gcc -I和gcc -L都是gcc编译器的选项,用于指定头文件和库文件的搜索路径。==
 等我们在一个程序中使用include <config.h>包含了我们自定义的文件,那么直接使用gcc xxx.c就会报错,要么使用include “config.h”要么使用gcc xxx.c -I ./编译程序

运行的时候也是默认去/usr/lib或者/usr/local/lib底下去找,但是每次去找太过于麻烦,而且把文件(动态库文件)放在/usr/bin也会有一定风险,所以临时指定库的位置,指定该程序运行时,在LD_LIBRARY_PATH所指定的路径去找库文 件:

export LD_LIBRARY_PATH=/home/orangepi/test   //动态库文件所在的位置
 ./mains

通常为了编码方便会把这个指令和./mains一起编写成一个脚本文件去运行,因为上面的指定只是临时指定,如果窗口关闭重新开了一个窗口指定就失效了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值