linux下的静态连接库和动态链接库

对linux的静态连接库和动态链接库分不清楚,在看了一篇博文后,现在想做个自己的总结,以加深印象:

1、库的基本概念:

库是可执行代码的二进制形式,其可以被调入操作系统调入内存进行执行。

在window和linux系统,都存在各自的库,但是两种系统的库并不能兼容,因为它们的编译器,连接器,汇编器都是不相同的。

在windows下,静态连接库的后缀是.lib;动态链接库的后缀是.dll

在linux系统下,静态链接库的后缀是.a;动态链接库的后缀是.so

2、静态连接库和动态链接库的命名:

  静态连接库:libxxxx.a

      以lib为前缀,紧接着跟静态库名xxxx(可以自己起),后缀是.a

  动态链接库:libxxxxx.so

      以lib为前缀,紧接着跟动态库名xxxx(可以自己起),后缀是.so

         动态链接库的名字还会有:libxxxxx.so.major.minor   major指的是动态库的主版本号; minor指的是动态库的副版本号

2、静态链接库和动态连接库的比较:

1)在于代码运行时载入内存的时候不同;程序在编译连接的时候,静态链接库的副本是需要载入内存的,并且当多个程序都设计到同一个静态连接库时,会在内存中存在多个副   本;

  动态链接库只有程序在运行的时候,才会载入到内存,而在编译连接时,只是提供了动态链接库的引用(理解为路径)。

2)静态库的代码在编译的过程中已经被载入可执行程序,所以体积比较大;

  动态库在在运行的时候才载入内存,在编译编译过程中只是引用,所以代码体积比较小。

3、为什么需要库的存在

  库是已经现有的,成熟的,可以复用的代码。在程序中可以直接引用,而减少工作量。

4、在linux系统下,如何产生静态库和动态库

  不管是静态库还是动态库,它们的产生都分为两步:

  第一步:有源文件编译成目标文件,后缀是.o

  第二步:根据动态或者静态库各自的命令,生成库

  4.1 静态库

    第一步:gcc -c jia.c     //生成一个jia.o的目标文件

    第二步:ar rcs libjia.a hello.o    //生成静态链接库libjia.a

  4.2动态库

    第一步:gcc -c jia.c   //生成一个jia.o的目标文件

    第二步:gcc -shared -fPIC -o  libjia.so jia.o  //生成一个动态库libjia.so

5、静态库和动态库的搜索路径和顺序:

  不管是动态库还是静态库都是有连接器ld进行寻找

  5.1 静态连接库:

    1)找gcc命令中参数指定的位置-L

    2)静态环境变量LIBRARY_PATH指定的搜索路径;

    3)默认的静态库的搜索路径/lib

    4)默认的静态库的搜索路径/usr/lib

  5.2 动态链接库:

    1)gcc命令中指定的动态库的搜索路径;

    2)环境变量LID_LIBRARY_PATH指定的搜索路径;

    3)配置文件/etc/ld.so.conf中指定的动态库的搜索路径;

    4)默认的动态库的搜索路径/lib;

    5)默认的动态库的搜索路径/usr/lib;

6、新安装一个库,如何使系统能够找到它

  如果安装在/lib或者/usr/lib下,那么默认连接器ld可以找到,不需要其他的操作;

  如果安装在其他的目录下,需要将其添加到/etc/ld.so.cache文件中,步骤如下:

  第一步:编辑/etc/ld.so.conf文件,加入库文件所在的目录的路径;

  第二步:运行ldconfig,该命令会重建/etc/ld.so.cache文件;

linux下的静态连接库和动态链接库,布布扣,bubuko.com

时间: 2024-08-04 10:16:22

linux下的静态连接库和动态链接库的相关文章

Linux下的动态连接库及其实现机制

Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术逐一进行了详细讨论. 本文着重讨论x86体系结构,这是因为 (1)运行Linux的各种体系结构中,以x86最为普及: (2)该体系结构上的Windows操作系统广为人知,由此可以较容易的理解Linux的类似概念: 下表列出了Windows与Linux的近义词,文中将不加以区分: Windows Linux 动

关于linux下GCC生成共享库(动态链接库)的探究

下面列出了我在对共享库(动态链接库)编写以及使用时遇到的几个简单问题进行探究和解答: 参考文档:http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html 1.静态库.动态链接库.共享库有什么区别? 静态库(windows下为.lib,linux下为.a)是在程序编写前就编译到目标程序中了,而动态链接库(windows下为.dll)可以在程序执行的任何时候被动态加载.共享库(linux下为.so)是在程序启动的时候加载到程序中. 1)

Linux下 静态链接库 和 动态链接库

先来说说C/C++编译过程 编译: 检查语句符号定义,将C/C++代码翻译生成中间语言. 链接: 将中间代码整合,生成可执行的二进制代码. 简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特殊格式的归档文件(打包的文件). 使用静态库: 1. 先编写库函数 1 #ifndef _PRINT_TEST_H_ 2 3 #define _PRINT_TEST_H_ 4 #ifdef __cplusplus 5 extern "C" 6 { 7 #endif 8 9 extern i

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库 创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a 查看程序依赖的动态库:readelf -a xxx|grep library如:可以看到,下面的交叉程序hello执行依赖于如下两个动态库.[email protected]:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep "library&quo

linux下的静态库和动态库

一.linux下的静态库 静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在! 二.linux下动态库的构建和使用 1.动态库的构建 gcc  -fPIC  -shared    -o  lib库名.so   源文件列表 例: gcc   -fPIC  -shared  -o  libmylib.so  max.c  min.c 2.动态库使用 gcc    -o  最终的可执行文件  源文件列表  -L 动态库的目录  -l库名 例子: 已

35.静态链接库和动态链接库

35.1.函数库的前世今生 (1)函数库就是一些事先写好的函数的集合,因为函数是模块化的,因此可以被复用:我们写好了某个函数,可以被反复使用,譬如A写好了某个函数然后共享出来,当B有相同的需求时就不需自己写直接用A写好的这个函数即可. (2)最开始是没有函数库的,每个人写程序都要从零开始自己写,时间长了慢慢的早期的程序员就积累下来了一些有用的函数:早期的程序员经常参加行业聚会,在聚会上大家互相交换各自的函数库:后来程序员中的一些大神就提出把大家各自的函数库收拢在一起,然后经过校准和整理,最后形成

Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库     本文地址:http://techieliang.com/2017/12/680/ 文章目录 1. 动态连接库创建与使用  1.1. 项目创建  1.2. 调用-使用.h文件 2. 静态库创建及使用  2.1. 创建  2.2. 使用 3. QLibrary动态加载动态库  3.1. 介绍  3.2. 范例  3.3.

静态链接库和动态链接库的区别及优缺点

动态链接库和静态链接库的区别 本文参考了以下博客:      1. http://blog.csdn.net/gamecreating/article/details/5504152      2. http://blog.csdn.net/left_la/article/details/12098545      3. http://blog.csdn.net/augusdi/article/details/6460415 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序