当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]Linux下静态库和动态库(共享库)的制作与使用

Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

静态函数库:
  这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。

动态函数库:
  这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减小应用程序的体积。

下面来介绍linux静态函数库的创建和使用:

  例程add.h add.c sub.h
sub.c
main.c:


  add.h

  #ifndef ADD_H
  #define ADD_H
  int add(int x,int y);
  #endif

  add.c

  #include <stdio.h>
  #include "add.h"

int add(int x,int y)
{
  
return (x+y);

}
--------------------------------------------------------------------

sub.h


  #ifndef SUB_H
  #define SUB_H
  int sub(int x,int y);
  #endif

  sub.c

  #include <stdio.h>
  #include "sub.h"
int sub(int x,int y)
{
  
return (x-y);

  }
-----------------------------------------------------------------------
main.c

#include <stdio.h>
  #include "sub.h"
#include "add.h"

  int main()
{

int
a,b;


a = add(1,2);


b = sub(10,5);

[!--empirenews.page--]


printf(“a=%d,b=%dn”,a,b);

    return 0;
  }
-----------------------------------------------------------------------
  不管是静态函数库还是动态函数库,都是由*.o目标文件生成。

所以先 gcc -c add.c

gcc -c sub.c

生成add.o
sub.o


  静态函数库由ar命令创建

  本例:ar -cr libaddsub.a add.o sub.o

  -c create的意思

  -r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
  到此静态函数库创建完毕。

  使用方法:通过gcc -o main main.c -L. -laddsub编译main.c就会把静态函数库整合进main。

  其中

  -L指定静态函数库的位置供查找,注意L后面还有'.',表示静态函数库在本目录下查找。

  -l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略。

  根据静态函数库的特性,此处删除libaddsub.a后main依然可以运行,因为静态库的内容已经整合进去了。

  动态函数库的创建和使用

gcc -shared -fpic -o libaddsub.so
add.c sub.c


-fpic:产生位置无关代码
-shared:生成共享库

用上述命令生成libaddsub.so 动态函数库。

  gcc -o out main.c -L. -laddsub

  此时还不能立即./out,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库不在里边。

  这个时候有好几种方法可以让他成功运行:

  最直接最简单的方法就是把libaddsub.so拉到/usr/lib 或/lib中去。


还有一种方法,假设libaddsub.so在/home/linux/addsub

export LD_LIBRARY_PATH=/home/linux/addsub
:$LD_LIBRARY_PATH


  另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Linux电脑输入poweroff退出操作系统后电源会自动切断,而嵌入式Linux如果没做特殊处理 输入poweroff关闭系统后电源依旧保持着。敲击键盘也不会有响应。原因是CPU和主板之间有着行业标准,比如ACPI(A...

关键字: Linux 电源 硬件IO

几乎一直到DXP甚至后来的AD时代,3D封装模型技术才开始慢慢日趋成熟,自此3D封装的发展完美的解决了这个问题,3D封装能够让我们在设计之前就能够看到真实的3D模型,很多器件空间比如长宽高,甚至在一些中空的地方下面摆一些...

关键字: DXP AD 3D封装

AD软件有自带制作简单的3D元件体用于3D PCB封装中下面以0603C封装为例进行简单介绍。

关键字: AD 3D元件体 0603C封装

学习Linux动态链接库是一个绕不开的话题,我们今天就一起来看一下什么是动态链接库、动态链接库有什么好处、如何编译出一个动态链接库等几个关于动态链接库的几个基本概念,废话少说咱们直接开始

关键字: Linux 静态链接库 动态链接库

借助 Adyen 的支付业务能力,SHOPLINE 能够简化并整合运营,轻松扩展业务,并提供宝贵的消费者洞察。 新加坡2022年9月28日 /美通社/ -- 服务众多领先企业的全球金融科技平台 Adyen(AMS:...

关键字: 智能电 AD 新加坡 PLATFORMS

新泽西州皮斯卡托威 2022年9月23日 /美通社/ -- 致力于推动技术进步、造福人类的全球最大专业技术组织IEEE今天宣布,Sophia Muirhead将成为...

关键字: IEEE UI AD TE

在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通...

关键字: Linux 内核链表

(全球TMT2022年9月15日讯)IBM于美国东部时间9月13日发布其下一代LinuxONE服务器,这是一个具有高度扩展性的基于Linux和Kubernetes的平台,旨在为企业提供所需的可扩展性,使其能用一个单一系...

关键字: IBM Linux NET 可扩展性

北京2022年9月14日 /美通社/ -- 在刚刚结束的2022年中国国际服务贸易交易会(简称"服贸会")上,一大批高科技企业展示了他们的数字技术和产品,数字服务贸易创新发展迎来先机。 Visito...

关键字: 机器人 SERVICES CHINA AD

下一代LinuxONE服务器扩展了IBM帮助行业客户实现可持续目标的能力,花旗银行就是很好的例子 北京2022年9月14日 /美通社/ -- IBM(纽约证券交易所:IBM)于美国东部时间9月13日发布其下一...

关键字: IBM Linux X86 数据中心

嵌入式教程

6897 篇文章

关注

发布文章

编辑精选

技术子站

关闭