当前位置:  技术问答>linux和unix

静态库,动态库,静态链接和动态链接

    来源: 互联网  发布时间:2016-12-01

    本文导语:  向各位大虾请教下: 对静态库和动态库,以及动态链接和静态链接四个概念比较模糊,上网搜索, 发现没有个明确的答案,望高手能详细说下。 1.静态库是什么? 2.动态库是什么? 3.两者的区别? 4.动态链接? 5.静态...

向各位大虾请教下:
对静态库和动态库,以及动态链接和静态链接四个概念比较模糊,上网搜索,
发现没有个明确的答案,望高手能详细说下。

1.静态库是什么?
2.动态库是什么?
3.两者的区别?

4.动态链接?
5.静态链接?
6.动态链接和静态链接的区别?

7.最后,静态库是否可以动态链接?动态库是否可以静态链接

有谁知道这些概念在什么比较权威的书上论述也说下.

先附个人愚见:
1.程序装载时,将其一并加载
2.程序运行时加载
3.区别:静态库可能在内存中有多个备份存在,因为有可能有多个程序要加载各自的静态库
动态库只可能在内存中有一份,多个程序共享使用

4.在链接程序时,不对库进行打包
5.在链接程序时,对库进行打包
6.动态链接,导致程序将其从编译机到别的机器时,需要将库一起拷贝
静态链接不存在上述问题

7.不清楚

一个问题10分,总分70.望高手不吝赐教

谢谢!

|

我们不希望叫程序去调用共享函数库的函数,而是在函数代码直接链接入程序代码中,也就是说,在程序本身拥有一份共享函数库中函数的副本。
========
这句话有问题吧?
共享库和静态库完全是两码事。
以Unix共享库为例
1. 共享库的格式和实际上更象是可执行文件格,里面的代码和数据都已经完成链接,用加载器载入内存后可以生成执行镜像,只是缺少一个入口点;动态连接的动作是在执行程序用加入链接信息,这样在程序执行时就可以有加载器将共享库映射到执行程序的地址空间中,执行程序就可以执行库中的函数了。
2. 静态库实际上就是.o文件的集合.

“在程序本身拥有一份共享函数库中函数的副本”的说法是不准确的。
当然在有些情况下,为了部署程序的便利,需要使用静态链接,这时可以使用-static选项,但是这并不是说“在程序本身拥有一份共享函数库中函数的副本”,而是这些程序库同时提供了静态库和共享库,用-static指示链接器链接静态库。
如果只有库.so没有.a链接 -static链接是不会成功的。

|
了解了他们的概念也就知道区别了吧

关于4 5 6
这两个术语中是我Linux的共享函数库(shared libraries)相关的。共享函数库就象Windows系统里的.dll文件,它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包含每个常用函数的拷贝,只是在需要时调用系统中共享函数库中常函数功能即可。这种方式我们称之为动态链接(Dynamically Linked)。但有时为了程序调试方便或其它原因,我们不希望叫程序去调用共享函数库的函数,而是在函数代码直接链接入程序代码中,也就是说,在程序本身拥有一份共享函数库中函数的副本。这种方式我们称之为静态链接(Statically Linked)。

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

    
 
 

您可能感兴趣的文章:

  • 如何在一个静态链接库中链接另一个静态链接库?
  • linux中静态链接库调用了另一个静态链接库
  • 编译静态链接库,其中使用了其它链接库,该如何写makefile
  • .a文件的动态链接和静态链接问题
  • 动态库链接 变为 静态库链接问题
  • linux下静态库使用:"未使用链接器输入文件,因为链接尚未完成"
  • 急求静态库引用静态库,该如何编译链接!!!
  • makefile.am中生成.a静态库的同时,链接其他.a静态库或.la动态库的问题
  • Linux下gcc编译时,如何以静态链接的形式编译?
  • 可执行文件比静态链接库小正常吗?
  • QT4.0 OpenSource版本开发Windows程序,如何进行静态链接?
  • linux 编译的时候,如何与.a静态库做链接生成.elf文件?
  • 静态库链接
  • 编译时如何区分动态链接和静态链接?
  • AIX 4.3下面如何静态链接GNU stdc++库到我的程序里面?
  • 怎么样编释成静态链接库?
  • 请问编译静态链接库的makefile该如何写?
  • LINUX下的静态库编译链接问题
  • linux动态链接库里全局变量和静态变量会导致动态库不可重入吗?
  • unix 下如何调用动态链接库和静态库结尾的文件(c语言)
  • 静态库动态库同时存在时,如何指定使用静态库
  • Linux 动态库,静态库的一些疑惑
  • 动态编译与静态编译驱动程式疑问?
  • 如何将动态可执行文件打包为静态
  • 请问unix/linux下动态连接库和静态连接库有什么区别?
  • 用静态库还是动态库?
  • driver的静态加载和动态加载占用内存问题
  • 送分.......linux下动态库和静态库的后缀名是什么呢?
  • gcc 做一个动态库 要包含一个静态库
  • linux中的动态库和静态库的问题
  • linux中,动态库中的函数如何调用静态库中的函数
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一个基本概念问题:静态函数只能调用静态方法,类的成员函数也是静态的吗?
  • 如何 用一个静态库 生成 另一个静态库
  • 请教:(static)静态变量和静态方法是什么意思?
  • 有把两个静态库.a合成一个静态库的简单方法吗
  • linux 生成静态库的时候怎么连接别的静态库
  • 静态博客 静态blog
  • C# 静态方法与非静态方法的区别分析
  • gcc的静态库.lib怎末在编译的时候连接。对了静态库是自己的???
  • PHP static局部静态变量和全局静态变量总结
  • c#静态方法和非静态方法详细介绍
  • 在静态上下文中不能引用非静态方法test(),天啊,为什么我的main()不能调用任何其它函数?
  • 静态函数,静态变量
  • java有无像vb那样的静态变量?java的staic是类的属性,那末,静态变量如何声明?
  • c++静态局部变量和静态函数示例
  • 一个静态库包含多个函数,应用程序连接了库中的某个函数,应用程序目标代码中是否还包含了该静态库中的其他函数代码?
  • 关于C++静态成员函数访问非静态成员变量的问题
  • asp.net伪静态后真正的静态文件无法访问的解决方法
  • 请问在LINUX下怎么设置静态IP?我在虚拟机中不能设置静态IP怎么办?
  • 为什么非静态变量不能用在静态方法上?什么意思?
  • C# 静态类与非静态类、静态成员的区别分析


  • 站内导航:


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

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

    浙ICP备11055608号-3