linux 动态库静态库,Linux下的动态库与静态库

2019-09-25

关键字:生成库、静态库引用、动态库引用

在 C 开发中,“库”是一个经常听到的名词。

所谓的库其实就是一个二进制文件。这个二进制文件的内容是可被其它C程序调用执行的函数。换句话说,库就是一组C代码的打包形式而已,打包是指将源代码以库的形式编译而生成的文件。

不过即使它只是源代码的打包,它也仍然是有系统专有性的,即不同系统下编译出来的库并不能互相兼容使用。

C库可分为动态库与静态库两种。引用了外部库的应用程序在编译时会在”链接期“处理库与程序源码之间的关系。

1、静态库

静态库顾名思义,它并不是“动态共享”的,每一个程序引用到一个静态库,就会在编译时将该静态库一起编译进去,即将静态库直接打包进引用它的程序中。

静态库文件的后缀是 .a,即常说的 A 文件。

静态库具有以下几个特点:

1、库中直接包含源码,在程序编译时直接将库中的源码打包到可执行文件中;

2、程序在运行时无需加载库文件,因而速度更快;

3、引用静态库的程序需要占用更多的磁盘空间;

4、静态库升级后需要重新编译所有引用了它的程序;

创建静态库:

1、设计库原型;

2、实现库的代码;

3、编译库源码生成 O 文件: gcc -c xxx.c -Wall;

4、通过 ar 命令将 O 文件生成静态库文件: ar crs libxxx.a xxx.o;

5、可以通过 nm 命令查看静态库信息: nm libxxx.a

Linux 中的静态库的名称是有规则的,必须以 lib 开头、以 .a 作为后缀。

调用静态库:

1、在需要引用到静态库中函数的源码里声明该函数的原型,通常静态库文件会提供一个头文件专门给外部程序调用使用;

2、直接在需要的地方调用静态库中的函数;

3、编译:gcc -o xxx2 xxx2.c -L. -lxxx;

-L 是设定库的查找路径。gcc 在编译时默认只会去 /lib, /usr/lib 等官方库目录下查找,但我们编译生成的静态库不一定放在那些目录中,所以要明确告诉编译器应该去哪里查找。后面的小圆点就表示在当前目录下查找库。

-lxxx 就是指明要链接的库的名称了。这里要注意,-l 后面接的是库的名称而不是库文件的名称,简单理解成是去掉库文件名称前面的 lib 前缀以及 .a 后缀后和字符串就行了。

也可以使用另一种编译选项: gcc -o xxx2 xxx2.c -L. -static -lxxx

4、编译完成,直接运行程序即可。

2、动态库

动态库与静态库相反,它是具有”全局共享性“的。一个程序在引用了共享库后,编译时仅会记录用到哪个共享库中的哪一个符号,并不会像静态库那样将库中代码一并打包到本应用程序中。

因此,动态库的特点基本上与静态库的相反:

1、编译结果更小;

2、多个程序可共享同一个库;

3、程序运行时需要先加载共享库;

4、动态库的升级直接替换库文件即可,一般不需要重新编译引用了库的程序。

创建动态库:

1、设计库原型并实现代码;

2、编译共享库源码生成 O 文件:gcc -c fPIC xxx.c -Wall;

3、将 O 文件生成为共享库文件: gcc -shared -o libxxx.so.1 xxx.o;

共享库文件的命名规则与静态库类似,都有固定的前缀后缀。中间的 xxx 即为库名称。.so 表示这个文件是一个动态库文件。.1 通常表示库的版本号,这样可以实现多个库版本共存的需求。

4、为共享库文件创建符号链接:ln -s libxxx.so.1 libxxx.so;

引用动态库:

1、声明库中函数接口,与上面静态库中的引用方法一致;

2、编译: gcc -o xxx2 xxx2.c -L. -lxxx;

gcc 在引用库时,首先会去查找动态库,当找不到动态库时才去查找静态库,静态库也找不到则会报错。

3、执行程序;

Linux 在运行时默认只会去缺省的几个目录下查找动态库并加载,若我们编译出来的动态库没有放在缺省库目录下,则会报找不到动态库的错误。解决的办法有:

1、扩展库加载路径: export LD_LIBRARY_PATH=xxx:$LD_LIBRARY_PATH; xxx 就是有这个动态库文件的路径。

2、将这个动态库放到缺省库目录下: /lib, /usr/lib;

3、新建 /etc/ld.so.conf.d/xxx.conf 文件,在这个文件中填写我们的动态库的路径,保存以后再执行 ldconfig 命令刷新系统变量;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西门子plm_西门子的Teamcenter、TIA Portal、NX MCD是如何结合在一起的

写在面前大家好,我是小智,智能制造之家号主~我一直PLM、MESMOM、SCADA、PLC等提倡融合(理念不一定对哈,大家理性看待,不必喷我),希望每个领域的朋友,在自己努力之余,抬头看看窗外的世界&#xf…

状态机 python_Python状态机设计

我真的不明白这个问题。设计模式非常清晰。请参阅Design Patterns book。class SuperState( object ):def someStatefulMethod( self ):raise NotImplementedError()def transitionRule( self, input ):raise NotImplementedError()class SomeState( SuperState ):def someStat…

linux games账号,linux for games

linux for games最近对linux 游戏发行版系统产生了兴趣,下面简要记录一些链接:https://itsfoss.com/linux-gaming-distributions/ (9 款游戏系统)https://fedoraproject.org/wiki/Games_Lab (fedora 游戏发行版 wiki)https://thishosting.rocks/best-lin…

jpa 自定义sql if_mybatis仿jpa 使用@createDate @updateDate

最近在使用mybatis的时候发现一个问题,就是好多的时候保存实体的时候,都要set create 和update,这样很麻烦,有没有可能类似jap 使用注解自动生成。jpa 的注解原理也拦截sql ,把sql 里面的参数绑定给修改一下。 了解了原理,我们也就自己可以可…

linux系统每月定时重启,linux系统定时重启.doc

linux系统定时重启linux系统定时重启--------------------每个月1号凌晨3点自动重启步骤如下:1、用root帐号登陆;2、打开终端窗口;3、输入"crontab -e"4、按Insert键。5、输入"0 3 1 * * reboot"6、按esc键。7、输入&quo…

卡牌大师怎么玩_用卡牌大师如何上分

联盟界流传一句话,如果只玩一个英雄。德玛可以上白金,瑞文可以上砖石,而卡牌可以上王者。所以说玩好卡牌是可以快速上分的,卡牌拥有稳定的控制,AOE伤害,大招的快速支援,可以说是英雄里近乎完美的…

直线电机原理动画_最新的3D动画演示:同步电机原理及技术,一般人看不懂

据说每台交流电机都使用旋转磁场,这项发明掀起了工业革命。分享一下LearnEngineering最新制作的一个动画,讲解的是同步电机RMF的工作原理和技术发展:同步电动的工作原理是:RMF旋转磁场相互作用。恒速特性是通过恒定磁场和旋转磁场…

l2的最优回归_大白话5分钟带你走进人工智能-第15节L1,L2几何解释和Ridge等回归...

第15节 L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归上一节中我们讲解了L1和L2正则的概念,知道了L1和L2都会使不重要的维度权重下降得多,重要的维度权重下降得少,引入L1正则会使不重要的w趋于0(达到稀疏编码的目的…

用python绘制图形_python绘制图形

1 2 File Name: draw3 Author: tim4 Date: 2018/8/15 16:475 Description: 图形绘制。十分有用,对于工作中实验性的项目,可以快速展示效果。如果使用java,还需要配合前端展示。6 7 8 importma…

linux中管道的概念,浅谈Linux管道

管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的“一切皆文件”的原则设计的。虽然实现形态上是文件,但是管道…

ttl接地是高电平还是低电平_说明图3.12中各门电路的输出是高电平还是低电平。已知它们都是74HC系列的CMOS电路 简单的逻辑门电路 判断各门电路...

1、高电平,有关。2、低电平。3、输入端接电源,悬空或高阻(10k以上)相当于接高电平,接地为低电平,通过低阻接入电平信号则认为输入信号与接入电平相同。则为OC门。图中的第一个输入为高电平,电路为与非门,则…

linux redis安装报错,Linux安装Redis实现过程及报错解决方案

今天安装redis出现些之前安装不曾出现错误,一并在此做个记录一、安装redis及出现错误首先下载redis,官方下载地址页面:https://redis.io/download我们这里选择稳定版6.0.1版本正常安装步骤如下:[rootlocalhost ~]# yum install gc…

python 工资管理软件_4_python之路之模拟工资管理系统

#!/usr/bin/env python#_*_ coding: utf-8 _*_#author:chenjianwen#email:1071179133qq.com importsys,os##定义操作列表 ops [查询员工工资,修改员工工资,增加新员工记录,退出] info{}defget_info():##读取文件得到员工信息 globalinfo with open(info…

dateformat 返回类型_SpringBoot返回date日期格式化

SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差问题描述在Spring Boot项目中,使用RestController注解,返回的java对象中若含有date类型的属性,则默认输出为TIMESTAMP时间戳格式(数据库datetime类型查询…

linux gcc中sin30度,学习gcc.pdf

学习gcc如何在 Ubuntu 下安装和使用 gccGCC 是在Linux 系统中用的比较多的编译器,一般做Linux 开发的朋友都会用 GCC 编译器,但今天在 Ubuntu 上安装 GCC 时出现了问题,于是上网查询如何在Ubuntu 上安装 GCC,答案如下:…

python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法

本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点。 代码: class LinkedListAlgorithms(object): def __init__(self): pass d…

工业机器人工具中心点标定的意义_一种利用平面标定板的机器人工具中心点标定方法_2015108676182_说明书_专利查询_专利网_钻瓜专利网...

技术领域本发明涉及机器人工具中心点(Toolcenterpoint,TCP)标定方法,尤其涉及一种利用平面标定板的机器人工具中心点标定方法。背景技术机器人工具中心点(Toolcenterpoint,TCP)是与机器人工具固连的工具坐标系的原点,工具实际工作点在工具坐标系中的坐标…

自动感光调节LED灯亮度C语言程序,单片机PWM调节LED灯亮度

刚搞完飞思卡尔智能车,昨天我一起做车的搭档跑来跟我说魏老师(我们系的前主任,不知道他们怎么认识的....)叫他帮忙做个可通过无线遥控调节LED灯亮度的设计方案,问我有没有兴趣做做,主要是魏老师也是受他以前的老同学(合工大的....…

python找到字符中空格所在的位置_Python 查找字符在字符串中的位置示例效果

Python 查找字符在字符串中的位置实例 下面为大家分享一篇Python 查找字符在字符串中的位置实例,具有很好的参考价值,希望对大家有所帮助。一起过来看看吧 str_1wo shi yi zhi da da niu char_1i nPosstr_1.index(char_1) print(nPos) 运行结果&#xf…

ztree 自定义参数_Ztree节点前加上两个自定义按钮

前言:在我的权限管理模块遇到了给某些角色加权限的问题,这时就需要实现将每个模块做成树,在每个节点前加上预览和编辑的按钮,这样可以根据数据库的某个字段给每个角色赋权限。必须必须吐槽的是,这部分的功能在网上没找…