网站首页 行业供求 行业产品 行业公司
行业资讯 行业网站 链接交换 网友收藏
行业供求 >> 信息展示:
Linux系统动态库与静态库函数的使用介绍
信息介绍:
暖春来袭 C语言0元**中

技术交流 找杨工 Q1075349026

在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Application BinaryInterface,ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位Intel体系上不同操作系统之间可移植的二进制文件格式。源代码到可执行程序的转换时需要经历以下过程:

1 预处理
2 编译
3 汇编
4 链接
预处理阶段:读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理
伪指令主要包括以下四个方面:
(1)宏定义指令(2)条件编译指令(3)头文件包含指令(4)特殊符号  预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。
编译是指把用**语言编写的程序转换成相应处理器的汇编语言程序的过程。从本质上讲,编译是一个文本转换的过程。对嵌入式系统而言,一般要把用C语言编写的程序转换成处理器的汇编代码。编译过程包含了C语言的语法解析和汇编码的生成两个步骤。
l 汇编是从汇编语言程序生成目标系统的二进制代码(机器代码)的过程。机器代码的生成和处理器有密切的联系。对于一款特定的处理器,其汇编语言和二进制的机器代码是一一对应的。汇编过程的输入是汇编代码,这个汇编代码可能来源于编译过程的输出,也可以是直接用汇编语言书写的程序。
l 连接是指将汇编生成的多段机器代码组合成一个可执行程序。一般来说,通过编译和汇编过程,每一个源文件将生成一个目标文件。连接器的作用就是将这些目标文件组合起来,组合的过程包括了代码段、数据段等部分的合并,以及添加相应的文件头。
GCC是Linux下主要的程序生成工具,它除了编译器、汇编器、连接器外,还包括一些辅助工具。对于**编译出来的可执行程序,当我们执行它的时候,操作系统又是如何反应的呢?如图2所示:

Linux的操作系统提供了一系列的接口,这些接口被称为系统调用(System Call)。系统调用 提供的是机制,而不是策略 。C语言的库函数通过调用系统调用来实现,库函数对上层提供了C语言库文件的接口。在应用程序层,通过调用C语言库函数和系统调用来实现功能。一般来说,应用程序大多使用C语言库函数实现其功能,较少使用系统调用。
ELF文件格式包括三种主要的类型:可执行文件、可重定向文件、共享库。
1.可执行文件(应用程序)
可执行文件包含了代码和数据,是可以直接运行的程序。
2.可重定向文件(*.o)
可重定向文件又称为目标文件,它包含了代码和数据(这些数据是和其他重定位文件和共享的object文件一起连接时使用的)。
*.o文件参与程序的连接(创建一个程序)和程序的执行(运行一个程序),它提供了一个方便**的方法来用并行的视角看待文件的内容,这些*.o文件的活动可以反映出不同的需要。
Linux下,我们可以用gcc -c编译源文件时可将其编译成*.o格式。
3.共享文件(*.so)
也称为动态库文件,它包含了代码和数据(这些数据是在连接时候被连接器ld和运行时动态连接器使用的)。
那么到底什么是库呢?
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
静态库:这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
动态库:这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

  1、静态链接库
  我们先制作自己的静态链接库,然后再使用它。制作静态链接库的过程中要用到gcc和ar命令。
 准备两个源码文件main.c和hello.c, 内容如下图示:

接下来使用命令把hello.c 制作成静态库文件libhello.a:

由上面知道静态库文件libmytest.a已经生成,用file命令查看其属性,发现它确实是归档压缩文件。
在main.c中调用了hello.c实现的函数,使用静态库的方式编译得到一个可执行文件main_a

2、动态库
动态库的后缀为*.so。在Linux发行版中大多数的动态库基本都位于/usr/lib和/lib目录下。
有时候当我们的应用程序无法运行时,它会提示我们说它找不到什么样的库,或者哪个库的版本又不合它胃口了等等之类的话。那么应用程序它是怎么知道需要哪些库的呢?我们前面已几个学了个很棒的命令ldd,用就是用来查看一个文件到底依赖了那些so库文件。
依旧使用刚才的源码文件
将其中的hello.c制作成一个名为libhello.so的动态链接库文件:
1、先生成目标.o文件:
[root@localhost make_so_a]# gcc -c hello.c -o hello.o
2、再生成so文件:
[root@localhost make_so_a]# gcc -fpic -shared hello.o -o libhello.so
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表),不用该标志外部程序无法连接。相当于一个可执行文件。
-fpic:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
接下来,就是如何使用这个动态库了。使用动态链接的方式生成*终的可执行文件
使用“-lhello”标记来告诉GCC驱动程序在连接阶段引用共享函数库libhello.so。“-L./”标记告诉GCC函数库位于当前目录。否则GNU连接器会查找标准系统函数目录。
这里我们注意,ldd的输出它说我们的libtest.so它没找到。
这是因为生成的可执行文件执行时搜索路径的顺序是:
1. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
2. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
3. 默认的动态库搜索路径/lib
4. 默认的动态库搜索路径/usr/lib

我们可以使用以下几种方法
方法一:
使用ldconfig命令,它是一个动态链接库管理命令
ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
执行如下:

方法二:
将生成的动态库文件拷贝到linux系统默认搜索的动态库文件的目录中,如/lib /usr/lib目录下,然后生成可执行文件并执行,如图示:

深圳专业嵌入式技术实训咨询QQ1075349026
方法三:
添加系统的环境变量LD_LIBRARY_PATH指定动态库的目录
执行可以看到,使用当前目录下的动态库文件链接生成可执行文件main_so,但是在执行时提示找不到相应的动态库,这时我们通过向系统添加环境变量LD_LIBRARY_PATH告诉动态链接库的地址,如图所示

通过本文的叙述和练习相信大家应该对Linux的库函数机制有了些许了解,*主要的是学会怎么去开发使用库文件。
这里是【深圳信盈达嵌入式实训学院】,单片机培训、嵌入式ARM培训、linux培训、FPCB培训、汇编C语言培训、Andriod培训、数电模电培训、
cortex-3m培训!

技术咨询:杨老师13724236349 QQ1075349026

信盈达实训网址:www.edu118.com

信息明细:
名 称:Linux系统动态库与静态库函数的使用介绍
类 型: 供应
类 别: 软件硬件 软件开发
地 区: 广东 深圳
用 户: 2011mcu
日 期: 2014-03-20 11:21:15
发布IP: 113.87.254.93
参考图片:

联络方式:
技术咨询:杨老师13724236349 QQ1075349026 这里是【深圳信盈达嵌入式实训学院】,单片机培训、嵌入式ARM培训、linux培训、PCB培训、FPGA培训,汇编C语言培训、Android培训、 数电模电培训、cortex-m3培训! 地址: 南山实训基地:深圳市南山区南新路与桃园路交汇处苏豪名厦705室 龙华实训基地:深圳市宝安区民治大道东边商务大楼1188 沙井实训基地:深圳宝安区沙井街道创新路沙井广场1号楼1506室, 布吉实训基地

友情提示:
    信息由用户自行发布,采用请谨慎,我们鼓励您当面交易。如有不符合法规或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们。名站在线只为传递信息,我们不做任何双方证明,也不承担任何法律责任。 信息转载,请标明来源于www.fwol.cn ,谢谢。

其它相似链接:
山东烤漆房配件&烤漆房配件批发&烤漆房配件生产...
山东烤漆房配件&烤漆房配件批发&烤漆房配件生产厂家*** 金亿力是主要生产和销售烤漆房配件的厂家,下面为您介绍一下烤漆房配件中打磨台、钢格板、过滤棉的特点! 金亿力打磨台特点 常用于金属件抛光打磨,木制品抛光打磨,焊接车间焊烟吸尘等,瑞远环保打磨工作台采用国际**的过滤技术,能保证极高的气流量同时还能对粉尘过滤效率可达99.9% 除尘工作台 可以根据客户现场具体需求做具体设计,我公司共推出三种...

报价合理的紫菜撑杆供应 玻璃钢型材厂家
报价合理的紫菜撑杆供应 玻璃钢型材厂家 安丘可尔特玻璃钢复合材料有限公司是一家从事紫菜撑杆生产的专业公司,位于山东省安丘市新安街道刘家营子村,交通便利。可尔特玻璃钢复合材料创立于2011-03-04,经过快速的发展,凝聚培养了一大批技术人才和管理团队。在玻璃钢行业发展中,我们主要面向需求群体提供紫菜撑杆等产品。 可尔特玻璃钢复合材料以生产为主营方向,生产的紫菜撑杆具有组装机械的用途,主要售往全国等地区,依...

环保床垫代理给您推荐实惠的环保床垫招商加盟
环保床垫代理给您推荐实惠的环保床垫招商加盟山东祥峰蒲草制品有限公司是一家在床上用品行业领域具有较高声誉的生产型公司,公司以环保床垫招商加盟为主要业务,奉行机遇与挑战并存,企业目标与个人价值并重的发展理念,力求为加盟商带来更多的商机。关注需求、专注服务、执着品质、追求效率是祥峰蒲草公司不变的追求。联系电话13054621399 祥峰蒲草公司是以经销,代理,加盟等的经营方式经营,为客户提供的环保床垫招商加盟具有...

便宜的西安水处理设备 西安报价合理的西安水处理设备哪里买
便宜的西安水处理设备 西安报价合理的西安水处理设备哪里买 西安华浦水处理设备有限公司自2012-11-13创立至今,规模从小到大,凭着过硬的技术、丰富的经验,优质的服务和良好的信誉,不断的发展壮大。在短时间内完成了企业创建、完善、发展过程,西安水处理设备产品已经销售到内蒙古;宁夏;青海;陕西;西藏;新疆市场。各界人士前来洽谈,联系人张经理,手机13571992207 华浦水处理设备实力雄厚,常年以不锈钢;铸铁材质的西安水处...

价廉物美的喷码机耗材产自泉州海博,优质喷码机
价廉物美的喷码机耗材产自泉州海博,优质喷码机 海博电子科技有限公司泉州分公司是一家经营喷码机耗材等产品的有限责任公司,公司位于福建省泉州市洛江区万安东辰大厦A栋708,拥有完整、科学的质量管理体系,以诚信、实力和产品质量获得业界的认可,提供的喷码机耗材同时也受到了广大中小企业的好评。 泉州海博在泉州市的广告展览器材行业市场已占有一席之地,PET聚乙烯对苯二甲酸脂材质的喷码机耗材主要采用传统工艺的工艺制造...


相关评论:
(欢迎网友发表评论,请注意网络文明)
(不支持 HTML 显示,请勿发HTML代码)
(评论需审核后才能显示)

本站推荐:
重庆网站建设
中国绿色有机食品网_有机
电子元件电子元器件供求信
山东金诚立达基金管理股份
找事8_找事上班,上找事
建档立卡家庭经济困难学生
立华制药
怎么安装蚊帐-百度经验
福建省优惠的防水嵌缝剂供
热门258商务卫士,恒远
粘结剂怎么样,划算的防水
南充螺旋钢管大量现货急
TCL徐州TCL空调售后
火王镇江火王燃气灶售后维
永康酿酒厂地坪哪家做得好
选择循环水多用真空泵的关
广州彩翼短信平台番禺销售
广州瑞雪制冷设备有限公司
深圳市泰富恒通金属制品有
余姚弹性聚脲地坪哪家做的
风化砂干式磁选机|风化砂
mdx61b0075-5
「预制泵站」一体化预制泵
LG售后吴江LG空调维修
关于如何延长滤布清洗机的
美作的茶让您体会不一样的
北京钢结构搭建二层制作别

电脑版

Copyright 2005-2024 名站在线[fwol.cn]版权所有
经营许可证:粤ICP备17047754号