当前位置:  编程技术>c/c++/嵌入式

深入探讨Linux静态库与动态库的详解(一看就懂)

    来源: 互联网  发布时间:2014-10-15

    本文导语:  库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 一、静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大--空间,因为整...

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
一、静态库和动态库的区别
1. 静态函数库
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大--空间,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
2. 动态函数库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用--时间,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级/更新比较方便。
 
二、静态库
(一)简单介绍
/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc
  main.c src/* -I./include -L./lib -lmpi -o main
    /opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin/arm-hismall-linux-gcc 为交叉编译工具链
    为换行,表示下一行与当行为同一行,‘'后面不能有空格
    main.c 为主函数
    src/* 为源文件
    -I后面接头文件
    -L后面接库文件路径路径
    -l后面接库文件名,全名为libmpi.a
    .a为静态库

(二)编写及使用静态库
(1)设计库源码 pr1.c、pr2.c 和 main.c
代码如下:

[bill@billstone make_lib]$ cat pr1.c
#include
void print1(void)
{
                printf("This is the first lib src!n");
}
[bill@billstone make_lib]$ cat pr2.c
#include
void print2(void)
{
                printf("This is the second src lib!n");
}
[bill@billstone make_lib]$ cat main.c
int main(void)
{
                print1();
                print2();
                return 0;


(2)  编译pr1.c、pr2.c 文件
代码如下:

[bill@billstone make_lib]$ gcc -O -c pr1.c pr2.c
[bill@billstone make_lib]$ ls -l pr*.o
-rw-rw-r--        1 bill          bill                    804    4 月  15 11:11 pr1.o
-rw-rw-r--        1 bill          bill                    804    4 月  15 11:11 pr2.o

(3)  链接静态库
为了在编译程序中正确找到库文件,静态库必须按照 lib[name].a 的规则命名,如下例中[name]=pr.
ar参数意义:
r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。
s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。
v:该选项用来显示执行操作选项的附加信息。
t:显示库的模块表清单。一般只显示模块名。
[bill@billstone make_lib]$ ar -rsv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
[bill@billstone make_lib]$ ar -t libpr.a
pr1.o
pr2.o
(4)  编译链接选项
-L 及-l 参数放在后面.其中,-L 加载库文件路径,-l 指明库文件名字.
[bill@billstone make_lib]$ gcc -o main main.c -L./ -lpr     //生成main
(5)执行目标程序
[bill@billstone make_lib]$ ./main
This is the first lib src!
This is the second src lib!

三、动态库(隐式调用)
(1)设计库代码 
代码如下:

[bill@billstone make_lib]$ cat pr1.c
#include
int p = 2;
void print(){
                printf("%p:%dn", &p, p);
                printf("This is the first dll src!n");
}

(2)生成动态库  xxx.so
代码如下:

[bill@billstone make_lib]$ gcc -O -fpic -shared -o xxx.so pr1.c
[bill@billstone make_lib]$ ls -l *.so
-rwxrwxr-x        1 bill          bill                  6592    4 月  15 15:19 xxx.so

(3)动态库的隐式调用 
代码如下:

[bill@billstone make_lib]$ cat main.c
int main()
{
       print();
       return 0;
}
[bill@billstone make_lib]$ gcc -o main main.c ./xxx.so
[bill@billstone make_lib]$ ./main
0x97b5d4:2
this is the first lib src!

当动态库的位置发生改变时,  程序将无法正常运行;  而动态库取代静态库的好处之一则是通过更新动态库而随时升级库的内容.

    
 
 

您可能感兴趣的文章:

  • C#中静态的深入理解
  • java 静态代理 动态代理深入学习
  • 全局静态存储区、堆区和栈区深入剖析
  • 深入理解c# static 静态数据成员和方法
  • 深入理解C++的动态绑定与静态绑定的应用详解
  • 深入C#实例成员和静态成员详解
  • C++ 类的静态成员深入解析
  • 深入C#中静态成员和实例变量详解
  • Java UrlRewriter伪静态技术运用深入分析
  • 深入解析java中的静态代理与动态代理
  • 深入JDBC sqlserver连接写法的详解
  • 深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解
  • 深入SQLServer中ISNULL与NULLIF的使用详解
  • 深入C++可见性与生命期的区别详解
  • 深入mysql并发插入优化详解
  • 深入android Unable to resolve target 'android-XX'详解
  • 深入MYSQL字符数字转换的详解
  • 深入SQL Server中定长char(n)与变长varchar(n)的区别详解
  • 深入C#任务管理器中应用程序选项隐藏程序本身的方法详解
  • 深入Windows下的回车是回车换行(rn)还是换行回车(nr)的详解
  • 深入分析NTFS中文件被锁定导致Process.Start失败的详解
  • 深入C# 内存管理以及优化的方法详解
  • 深入c# Func委托的详解
  • 深入分析Java内存区域的使用详解
  • Informatica bulk与normal模式的深入详解
  • 深入JAVA对象深度克隆的详解
  • 深入mysql存储过程中表名使用参数传入的详解
  • 深入SQL截取字符串(substring与patindex)的详解
  • 深入Java不可变类型的详解
  • 深入Android开发FAQ的详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 大家能否深入探讨一下J2EE到底包含那些东东,在实际企业应用是否如同J2EE所承诺的一样!
  • 深入探讨:main函数执行完毕后,是否可能会再执行一段代码?
  • 深入探讨:Oracle中如何查询正锁表的用户以及释放被锁的表的方法
  • 基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探讨
  • 深入探讨java的接口和抽象的内涵!
  • 深入探讨java的接口和抽象的内涵!(续上贴,上贴分已给)
  • C++实现strcmp字符串比较的深入探讨
  • 深入探讨:MySQL数据库MyISAM与InnoDB存储引擎的比较
  • 深入探讨C#中的结构struct
  • 整体刷新和局部刷新frameset窗口问题深入探讨
  • 用32位int型变量表示单引号括起来的四个字符的深入探讨
  • 深入探讨CSS中字体元素
  • 深入探讨C#中的const、readonly关键字
  • 函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
  • 深入探讨:oracle中row_number() over()分析函数用法
  • 深入探讨C++父类子类中虚函数的应用
  • 深入探讨linux下进程的最大线程数、进程最大数、进程打开的文件数
  • 深入探讨:oracle中方案的概念以及方案与数据库的关系
  • Java源码分析:深入探讨Iterator模式
  • 深入探讨JAVA中的异常与错误处理
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3