Linux下的静态库与动态库

2017年02月18日 09:17:13 LLZK_ 阅读数:10257 标签: linux动态库静态库区别使用 更多

个人分类: Linux学习笔记
所属专栏: Linux学习之路
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LLZK_/article/details/55519242

在windows和Linux下都存在着大量的库,库是什么呢?本质上来说,库时一种可执行代码的二进制形式,可以被操作系统载入内存执行。


库有什么用呢?

我们通常将一些公用函数写成函数库,所以库是别人写好的,现有的,成熟的,可以服用的代码,你可以使用但要必须得遵守许可协议。在我们现实开发过程中,不可能每一份代码都从头编写,当我们拥有库时,我们就可以直接将我们所需要的文件链接到我们的程序中。可以为我们节省大量的时间,提高开发效率。所以,哭的存在意义是不可藐视的。


Linux下的库

Linux下库分为两种,静态库和动态库。

区别

这两种库相同点是两种库都是由.o文件生成的,下边讨论一下它们的不同点:

  • 静态库 
    静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。 
    链接时间: 静态库的代码是在编译过程中被载入程序中。 
    链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。

  • 动态库 
    动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so” 
    链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。

它们两个还有很明显的不同点:当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。(因为静态链接是在编译时将所有的函数都编译进了程序。而动态链接是在运行是才调用库里相应函数)


两种库的应用实例

问题描述:现假设我们现在需要一个函数库,库里面有一个需要可以打印时间的函数,分别以静态库,动态库的方式实现。 
准备三个文件 time.c time.h test.c。

//time.h  函数库的头文件
#ifndef __TIME_H_
#define __TIME_H_

#include<stdio.h>

void time();

#endif //__TIME_H_
//time.c函数库的源程序,包含时间打印函数
#include"time.h"

void time()
{
    printf("today is 2017:2:17\n");
}
//test.c  测试函数,调用了时间打印函数time
#include"time.h"

int main()
{
    time();
    return 0;
}

上面提到过,无论静态库还是动态库都是由.o文件生成的,所以将time.c编译成time.o。

gcc -o time.c


在下面生成静态库,动态库文件的时候,你可能会出现这样的错误:

/usr/bin/ld: cannot find lc

执行下面命令安装glibc-static即可:(在root权限下)

yum install glibc-static

静态库

由.o文件生成静态库文件

设静态库名称为mytime,所以静态库的文件名就为libmytime.a

ar cr libmytime.a time.o

静态库的使用

执行下面命令进行静态链接,生成可执行程序。

gcc -o test test.c -static -lmytime -L.
  • -static :表示程序的静态链接
  • -lmytime:链接静态库mytime
  • -L. :链接时需指明静态库所存在的路径,‘.’表示当前路径

执行test

./test

现将当前目录下的静态库文件libmytime.a删除,再次运行test。我们会发现程序依然运行成功。

这是因为静态库链接是在程序编译时就将所有代码整合到了程序中,编译后的可执行程序不再需要外部的函数库支持。


动态库

由.o文件生成动态库

设动态库名为mytime,则动态库的文件名就为libmytime.so

gcc -shared -fPCI -o libmytime.so time.so

动态库的使用

执行下面命令进行动态链接,生成可执行程序。

gcc -o test test.c -lmytime -L.

执行test。

./test

我们会发现程序报错了,错误是没有找到动态库libmytime.so 。因为进行动态链接时,程序并不会在当前目录中寻找动态库,而是会在/usr/lib目录下寻找,所以我们将动态库libmytime.so移动到/usr/lib下就可以了。(在root权限下)

mv libmytime.so /usr/lib

再次运行程序,程序运行成功。


比较两个可执行文件的大小,我们会发现静态链接生成的可执行文件要远远大于动态链接生成的可执行文件。

  • 静态链接 

  • 动态链接

[转帖]Linux 的静态库与动态库的更多相关文章

  1. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  2. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  3. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  4. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  5. Linux 静态库和动态库 使用说明

        Linux下程序运行中,有两种库,静态库和动态库.     静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改 ...

  6. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  7. 详细讲解 关于Linux静态库和动态库的分析

    基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...

  8. linux下的共享库(动态库)和静态库

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  9. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

随机推荐

  1. java 发邮件

    //先从oracle 下载mail.jarpackage test; import javax.mail.BodyPart; import javax.mail.Message; import jav ...

  2. 为什么zookeeper集群中节点配置个数是奇数个?

    Zookeeper的大部分操作都是通过选举产生的.比如,标记一个写是否成功是要在超过一半节点发送写请求成功时才认为有效.同样,Zookeeper选择领导者节点也是在超过一半节点同意时才有效.最后,Zo ...

  3. fabric使用

    1.入门博客https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html 如果遇到这个问题说明你的fabric版本太高了 卸载到现在版本重新安装就 ...

  4. [matlab] 4.M函数

    函数文件的编写 新建一个函数文件 函数的第一行的格式 :function [输出的参数] =函数名 (输入的参数) 输入和输出的参数可以有多个 保存函数文件的时候,注意文件名要和函数名一样 函数头和函 ...

  5. L2-010 排座位 (并查集)

    这里唯一需要注意的是,各个输出的条件在题目中有点描述模糊. 是朋友关系,(不管是不是间接朋友关系) 既不是朋友也不是敌人(这里不用管是不是间接朋友) 是敌人关系,同时是间接朋友关系 是单纯的敌人关系, ...

  6. 网站建设部署与发布--笔记4-部署mysql

    部署MySQL 1.更新操作系统 $ yum update -y 2.安装mysql数据库,在CentOS 7.2 中,使用了mariadb替代了官方的mysql $ yum install mari ...

  7. java jvm heap dump及 thread dump分析

    一.概念: 在进行java应用故障分析时,经常需要分析内存和cpu信息,也就说所谓的heap dump 和 thread dump heap dump: heap dump文件是一个二进制文件,需要工 ...

  8. 江苏省选2019Round1游记

    JSOI2019R1过去了. Day0 打板子.看白书. 晚上太热了,楼下还在打铁,睡不着. 折腾到好晚才勉强睡着. Day1 早上好困啊. 开T1.看起来T1的60分很可做的样子?5min打完了(为 ...

  9. 开发框架模块视频系列(2)-Winform分页控件介绍

    在软件开发过程中,为了节省开发时间,提高开发效率,统一用户处理界面,尽可能使用成熟.功能强大的分页控件,这款Winform环境下的分页控件,集成了数据分页.内容提示.数据打印.数据导出.表头中文转义等 ...

  10. Nginx服务器的使用与反向代理负载均衡

    目录 Nginx服务器 一:什么是Nginx? 什么是Nginx - Nginx与其他服努器的性能比较 二:如何在Linux中搭建Nginx服务器? 常见的错误 三:Nginx的反向代理和负载均衡 什 ...