关于linux下的共享库(动态库)和静态库
1.什么是库
在windows平台和linux平台下都大量存在着库。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
由于windows和linux的本质不同,因此二者库的二进制是不兼容的。
本文仅限于介绍linux下的库
2.库的种类
linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
3.库存在的意义
库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
4.库文件是如何产生的在linux下
静态库的后缀是.a,它的产生分两步
Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表
Step 2.ar命令将很多.o转换成.a,成文静态库
动态库的后缀是.so,它由gcc加特定参数编译产生。
例如:
$ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *.
5.库文件是如何命名的,有没有什么规范
在linux下,库文件一般放在/usr/lib和/lib下,
静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称
动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号
6.如何知道一个可执行程序依赖哪些库
ldd命令可以查看一个可执行程序依赖的共享库,
例如# ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
可以看到ln命令依赖于libc库和ld-linux库
7.可执行程序在执行的时候如何定位共享库文件
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径
此时就需要系统动态载入器(dynamic linker/loader)
对于elf格式的可执行程序,是由ld-linux.so*来完成的
它先后搜索elf文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib目录
找到库文件后将其载入内存
8.在新安装一个库之后如何让系统能够找到他
如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。
如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下
1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
2.运行ldconfig,该命令会重建/etc/ld.so.cache文件
############################################################
linux中编译静态库(.a)和动态库(.so)的基本方法
静态库 在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项: ar 命令的命令行格式如下: 比如创建一个静态库文件的命令如下: 使用ranlib程序创建库的索引,索引存放在库文件内部. 用nm程序显示存档文件的索引,它可以显示目标文件的符号 动态库 1.创建共享库 一般应用程序的库文件不与系统库文件放在同一个目录下,一般把应用程序的共享库文件放在/usr/local/lib下,新建一个属于自己的目录apue,然后把刚才libapue.so复制过去就行了 以后在编译程序时加上编译选项: /* 参数的配置通过man gcc可以看到 -llibrary 连接名为 library 的 库文件. 连接器 在 标准搜索目录 中 寻找 这个 库文件, 库文件 的 真正 名 字 |
转载于:https://my.oschina.net/alphajay/blog/3858
关于linux下的共享库(动态库)和静态库相关推荐
- 嵌入式Linux支持dlopen,Android下使用dlopen函数动态调用.so链接库
在这篇文章([09.03.25]Linux环境中dlopen函数的简单应用)中.实现了在UBUNTU LINUX环境下使用dlopen函数动态调用.so链接库.但是也提到了在Android下未能成功. ...
- Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试
用C编译器编译源文件:gcc 源文件 -o 可执行文件名 详细步骤: gcc -E a.c -o a.i预处理器将头文件展开,宏替换,去掉注释 gcc -S a.i -o a.s编译器将C文件变成汇编 ...
- linux uname内核,Linux下confstr与uname函数_获取C库与内核信息
Linux下confstr与uname函数_获取C库与内核信息 #include #include //uname int main(int argc, char **argv[]) { struc ...
- Linux 下谨慎使用 rm,避免从删库到跑路的悲剧发生
我们该如何再次避免删库"跑路"等事件的再次发生? 对此,在企业首先做好权限管理以及多重审核机制的同时,CSDN 也曾教诸多程序员们如何在 Linux 下谨慎使用 rm,避免从删库到 ...
- 【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)
动静态库的基本原理 认识动静态库 动静态库的概念 静态库的打包与使用 静态库的打包 静态库的使用 动态库的打包与使用 动态库的打包 动态库的使用 动静态库的基本原理 动静态库的本质就是可执行程序的&q ...
- 【Linux】磁盘结构/文件系统/软硬链接/动静态库
文章目录 前言 一.磁盘结构 1.磁盘的物理结构 2.磁盘的存储结构 3.磁盘的逻辑结构 二.文件系统 1.对 IO 单位的优化 2.磁盘分区与分组 3.对分组的具体管理方法 4.文件操作 三.软硬链 ...
- linux编译c++ 静态库,C/C++ 条件编译静态库
==>windows 下方法: 1.方法一:VS工程中中直接添加 1.1在VS的属性->常规->附加库目录,添上文件夹的路径:例如:lib/x64: 1.2输入的附加依赖项,添加上库 ...
- 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )
文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...
- Linux下最简单的动态域名用法
Linux下最简单的动态域名用法 估计做IT的哥们象我这样ADSL包月的应该很多,我一般家里有一部电脑是24小时开机的,它上面跑着我的各种应用,也相当于我的一个网络硬盘.为了方便自己能从远程访问,我们 ...
- Linux下利用共享空间来实现两个没有亲缘关系的进程间通信
Linux下利用共享空间来实现两个没有亲缘关系的进程间通信 功能需求: 1.打开一个Linux命令窗口作为写入端->客户端(client) 2.打开另一个Linux命令窗口作为读取端->服 ...
最新文章
- python读取excel指定列-Python读取excel指定列生成指定sql脚本的方法
- 这篇 Linux 总结得很棒啊!
- iOS CAReplicatorLayer 简单动画
- Spread基本知识(一)
- UVA1583 - Digit Generator
- 使用Fiddler自定义百度云分享提取码
- 吸猫就吸Tomcat之Pipeline-Valve巧妙设计
- jqueryUI日期控件和时间控件
- 基于ATT-LSTM的语音情感分类
- Android 打开应用商店评分
- 好未来 Dolphin-儿童口语表达能力AI自动评测:顶尖AI算法技术与教育理念的有机结合 | 百万人学AI评选
- 用c 语言乘法运算结果,c中的基本运算
- 【5G核心网】 NGAP 消息
- mac的ftp工具-cyberduck
- CSR8675模组,支持蓝牙APTX
- 群晖家用NAS选购心得
- java中separator_JAVA中file.separator ,path.separator,line.separator
- 由浅入深:3D打印技术我们从电影开始谈
- GBase 8s灾备集群HAC (一) 概述
- rsvp.exe,AdskScSrv.exe ,avp.exe