http://www.cppblog.com/wolf/articles/74928.html

http://www.cppblog.com/wolf/articles/77828.html

http://www.jb51.net/article/34990.htm

大部分内容抄的以上文章的。

1 库的分类

根据链接时期的不同,库又有静态库和动态库之分。

静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。

有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)

2 静态库和动态库的比较

链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。

首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。

再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。

而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。

那么,是不是静态库就一无是处了呢?

答曰:非也非也。不是有句话么:存在即是合理。静态库既然没有湮没在滔滔的历史长河中,就必然有它的用武之地。想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。

所谓有得必有失,正因为动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣。然而瑕不掩瑜,动态库的不足相对于它带来的好处在现今硬件下简直是微不足道的,所以链接程序在链接时一般是优先链接动态库的,除非用-static参数指定链接静态库。

动态链接库

1. 创建动态链接库

#include

void hello()

{

printf("hello world/n");

}

用命令gcc -shared hello.c -o libhello.so编译为动态库。可以看到,当前目录下多了一个文件libhello.so。

2. 再编辑一个测试文件test.c,内容如下

#include

int main()

{

printf("call hello()");

hello();

}

编译 gcc test.c -lhello

-l 选项告诉编译器要使用hello这个库。奇怪的地方是动态库的名字是libhello.so,这里却使用hello.

但这样还不行,编译会出错。

In function `main':

test.c:(.text+0x1d): undefined reference to `hello'

collect2: ld returned 1 exit status

这是因为hello这个库在我们自己的路径中,编译器找不到。

需要使用-L选项,告诉hello库的位置

gcc test.c -lhello -L. -o test

-L .告诉编译器在当前目录中查找库文件

3. 编译成功后执行./test, 仍然出错

说找不到库

有两种方法:

一、可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行)。

二、把当前路径加入环境变量LD_LIBRARY_PATH中

当然,如果你觉得不会引起混乱的话,可以直接把该库拷入/lib,/usr/lib/等位置(无可避免,这样做也要有权限),这样链接器和加载器就都可以准确的找到该库了。

我们采用第二种方法:export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

这样,再执行就成功了。

下面再讲讲静态链接库

仍使用刚才的hello.c和test.c。

1. gcc -c hello.c 注意这里没有使用-shared选项

2. 把目标文件归档    ar -r libhello.a hello.o

程序 ar 配合参数 -r 创建一个新库 libhello.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

3. 在程序中链接静态库

gcc test.c -lhello -L. -static -o hello.static

或者   gcc test.c libhello.a -L. -o hello.static

生成的hello.static就不再依赖libhello.a了

两个有用的命令

file程序是用来判断文件类型的,在file命令下,所有文件都会原形毕露的。

顺便说一个技巧。有时在 windows下用浏览器下载tar.gz或tar.bz2文件,后缀名会变成奇怪的tar.tar,到Linux有些新手就不知怎么解压了。但 Linux下的文件类型并不受文件后缀名的影响,所以我们可以先用命令file xxx.tar.tar看一下文件类型,然后用tar加适当的参数解压。

另外,还可以借助程序ldd实用程序来判断。

ldd是用来打印目标程序(由命令行参数指定)所链接的所有动态库的信息的,如果目标程序没有链接动态库,则打印“not a dynamic executable”,ldd的用法请参考manpage。

例如:

用ldd命令查看ffmpeg依赖什么库 指令 : ldd `which ffmpeg`

alsa的动态库安装在哪里_Linux链接库一(动态库,静态库,库放在什么路径下)...相关推荐

  1. alsa的动态库安装在哪里_linux 给运行程序指定动态库路径

    1. 连接和运行时库文件搜索路径到设置 库文件在连接(静态库和共享 库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/li ...

  2. PCL库安装下载(百度云盘链接)

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  3. python第三方库安装(复习)

    python第三方库安装 一.概述看见更大的Python世界第三方库的pip安装方法第三方库的集成安装方法第三方库的文件安装方法 二.看见更大的Python世界 2.1 Python社区 万个第三方库 ...

  4. python PIL库安装

    python编程用到图像有时会出现 decoder jpeg not available 那是因为没有装jpeg编解码库或者是python的PIL库安装不正确. 出现这种情况最好删掉PIL库(进入py ...

  5. pythonpil安装教程_python PIL库安装

    python PIL 库安装 python 编程用到图像有时会出现 decoder jpeg not available 那是因为没有装 jpeg 编解码库或者是 python 的 PIL 库安装 不 ...

  6. 【Java开发语言 00】环境搭建(配置java环境+‘javac’不是内部或外部命令,也不是可运行的程序+安装idea+idea基本用法+新建项目+在新项目的src路径下新建包和类+基础调试+路径)

    idea入门 1 idea安装 1.1 官方下载地址 2 Java语言环境的搭建 下载JDK 安装 JDK(安装路径不要有中文或者特殊符号如空格等) 配置环境变量(必须是全英文状态下的字符) clas ...

  7. Linux项目设计:ALSA库安装(声卡)、语音识别、文字转语音、语音转文字

    文章目录 一.ALSA库的安装使用 (一)基本概念 (二)交叉编译 ALSA 库及其工具集 (三)ALSA程序模块 二.科大讯飞语音识别 (一)下载语音识别包 (二)文字转语音包使用 (三)语音转文字 ...

  8. 基础IO(文件接口、安装内核源码超详细步骤图解、静态库与动态库)

    基础IO C语言的文件操作接口 fopen fclose fread fwrite fseek 系统调用文件接口 open close read write lseek 安装内核源码 文件描述符&am ...

  9. LAPACK 动态库安装

    安装包直接从官网下载即可,下面只介绍安装步骤 一般来说软件或库的安装只需要编译静态库的 lapack 和 blas 就可以了,今天在安装 QUIP 时竟然必须使用 lapack 动态库才能成功,否则一 ...

最新文章

  1. java 它 引用(基本类型的包装,构造函数和析构函数c++不同)
  2. Debian 系统初体验
  3. smartarm3250 performance
  4. CSP认证201312-3最大的矩形[C++题解]:枚举
  5. 发布服务器 bugzilla, streber 数据库备份方案
  6. 在 CCR 环境中使用 Exchange 命令行管理程序移动存储组和数据库
  7. 允许匿名用户访问VisualSVN
  8. criteria和oracle数据库使用,[原创]条件查找Criteria用法
  9. svn-the working copy is locked due to a previous
  10. Ruby on Rails本地安装方法
  11. 如何区分同一Class的不同实例对象
  12. redhat linux查看进程cpu,Redhat Linux 查看cpu、memory 等命令
  13. unity和python哪个好学_纠结学习Python还是unity3d_课课家教育
  14. MES(制造企业生产过程执行管理系统)
  15. 【原文件】辞海(第六版彩图本) pdf
  16. C语言实现快速排序算法
  17. 一键开关Oracle服务
  18. 基于TCP协议的游戏代理接口测试工具<二>:工具架构与代理主体实现
  19. python运势预测程序_运势.py · Scar/Python-Spider - Gitee.com
  20. 立创商城PCB库使用说明

热门文章

  1. Linux版本JDK1.8下载与安装
  2. python是开源工具吗_微软最强 Python 自动化工具开源了!不用写一行代码
  3. Win11系统点击回滚没有反应是怎么回事
  4. 搜狐视频怎么下载到电脑
  5. 轻量级RTSP服务模块和RTSP推流模块适用场景区别
  6. android创建空文件,ADT 更新 eclipse srclayout 文件夹创建时候为空
  7. JAVA中和、||和|的区别?
  8. Java面试——MyBatis系列总结
  9. Java数据库篇2——数据库基本操作
  10. controller中返回数据