您的位置:首页 > 运维架构 > Linux

什么是库?(linux平台下的理解)

2016-04-19 09:43 447 查看
什么是库?
作者:黑色印记

我所认为的库,就是里面有许多的库文件。而库文件的特点是:你可以使用它,但你不能看到它是如何实现的。因而库文件也赋予了库相同的特性。大家一定很迷惑为什么要赋予库文件和库这样的特性。那是因为库文件里面一般是一种技术的核心代码。为了将这种技术出售出去,供别人使用,但又不希望泄露自己的技术。于是便赋予了库这个特性。这也是我们为什么学习库的原因。
知道了库的重要性,那我们就要知道库在哪里?linux下库主要处于/lib和/usr/lib目录中。两者的区别在于:

/lib 指系统运行相关的库文件

/usr/lib 一般指第三方软件的库文件

了解了库的重要性,位置。那我们就要了解库的种类了。库有两种类型。分别是静态库和动态库。我们要区别两者的不同,就先看它们的定义。

静态库: 在执行程序之前就加入了到了执行代码中,成为执行程序的一部分,一般是以.a为文件后缀。

动态库: 在执行程序启动时加载到执行代码中,一般是以.so为文件后缀。

从静态库,动态库的定义中,我们可以知道两者的优缺点:

(1)动态库的编译时间短。

(2)静态库的执行时间短。

(3)静态库代码太拥挤,不易升级。

(4)静态库代码的布置比较好。

当我们了解到库有两个种类,那我们该如何选择呢?什么时候选择静态库,什么时候选择动态库?这主要从两个方面进行选择。

第一点,根据软件是否经常升级,若经常升级,则选择动态库。

第二点,封装代码的大小,若代码过大,选择静态库。

了解到库的重要性,库的位置,以及库的种类,接下来,我们就要学会如何建立一个库和如何使用一个库?

在建立一个库,以及使用一个库时,我们需要使用一些指令,让我给大家慢慢介绍。

静态库的建立与使用:

建立: gcc -c test.c (将c文件生成.o文件)

ar rcs libtest.a test.o (将.o文件生成libtest.a静态库。其中lib 和.a是静态库的前缀和后缀。中间 test 才是静态库的名)

使用: gcc main.c libtest.a 或者 gcc main.c -ltest -L.

-l 指链接库,其中test是库名。

-L 指链接的路径

. 指当前目录

动态库的建立与使用:

建立: gcc -shared -fPIC -otest.so test.c (其中test是库名)

使用: gcc main.c ./test.so -o 可执行文件名

了解到了动态库,以及静态库,我就觉得有必要向大家介绍一下什么是静态编译,什么是动态编译?

静态编译:静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。

动态编译:动态编译的可执行文件需要附带一个的动态链接库。在执行时,需要调用其对应动态链接库中的命令。

从二者的定义,我们可以知道他们的优缺点:

动态编译一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。

静态编译正好和动态编译互补。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: