首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
webstorm
notepad++
visual
emacs
phpstorm
windows
intellij-idea
terminal
eclipse
protocols
markdown
编辑器
vim
pycharm
git
svn
ide
diff
visual-studio
clone
macos
alias
github
sublime-text
sublimetext
visual-studio-code
当前位置:
开发笔记
>
开发工具
> 正文
linux静态链接库与动态链接库的区别及动态库的创建
作者:余夫子曰 | 来源:互联网 | 2017-07-18 07:47
linux静态链接库与动态链接库的区别及动态库的创建--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
一、引言
通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。
其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是如雷贯耳的动态链接库(dynamic link library)技术。
二、动态链接库的特点与优势
首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:
1. 可以实现进程之间的资源共享。
什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。
2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。
3. 甚至可以真正坐到链接载入完全由程序员在程序代码中控制。
程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。
三、动态链接库的创建
由于动态链接库函数的共享特性,它们不会被拷贝到可执行文件中。在编译的时候,编译器只会做一些函数名之类的检查。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须实用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(Position Independent Code (PIC))。
对gcc编译器,只需添加上 -fPIC 标签,如:
gcc -fPIC -c file1.c
gcc -fPIC -c file2.c
gcc -shared libxxx.so file1.o file2.o
注意到最后一行,-shared 标签告诉编译器这是要建立动态链接库。这与静态链接库的建立很不一样,后者用的是 ar 命令。也注意到,动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”
四、动态链接库的使用
使用动态链接库,首先需要在编译期间让编译器检查一些语法与定义。
这与静态库的实用基本一样,用的是 -Lpath 和 -lxxx 标签。如:
gcc file1.o file2.o -Lpath -lxxx -o program.exe
编译器会先在path文件夹下搜索libxxx.so文件,如果没有找到,继续搜索libxxx.a(静态库)。
在程序运行期间,也需要告诉系统去哪里找你的动态链接库文件。在UNIX下是通过定义名为 LD_LIBRARY_PATH 的环境变量来实现的。只需将path赋值给此变量即可。csh 命令为:
setenv LD_LIBRARY_PATH your/full/path/to/dll
一切安排妥当后,你可以用 ldd 命令检查是否连接正常。
ldd program.exe
如果一切顺利,它将会输出你所用到的函数库的清单。否则,将会抱怨无法找到某个库。
windows
程序员
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
windows
90后程序员的职业发展之路:从年薪3w到30w的经验分享
本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ...
[详细]
蜡笔小新 2023-12-14 15:22:09
windows
OC学习笔记之@property和@synthesize
本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ...
[详细]
蜡笔小新 2023-12-14 12:05:06
windows
Android源码深入理解JNI技术的概述和应用
本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ...
[详细]
蜡笔小新 2023-12-13 10:00:57
windows
在Mac上安装Xamarin,实现在Windows上开发iOS app的方法
本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ...
[详细]
蜡笔小新 2023-12-11 19:13:35
windows
搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ...
[详细]
蜡笔小新 2023-12-14 17:03:58
windows
Python版Protobuf安装和使用教程
本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ...
[详细]
蜡笔小新 2023-12-14 09:27:58
windows
2019年上半年内蒙古计算机软考考试报名通知及考试时间
本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ...
[详细]
蜡笔小新 2023-12-13 16:22:51
windows
拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎 ...
[详细]
蜡笔小新 2023-12-13 16:11:00
windows
从零学Java(10)之方法详解,喷打野你真的没我6!
本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ...
[详细]
蜡笔小新 2023-12-13 13:44:16
git
Java中闭包的争论以及闭包的定义和特性
闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ...
[详细]
蜡笔小新 2023-12-13 10:46:54
git
Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ...
[详细]
蜡笔小新 2023-12-12 20:56:55
git
程序员最美情人节礼物:用JS渲染的3D玫瑰
本文介绍了程序员最美的情人节礼物,即使用JS渲染的3D玫瑰,通过在QQ空间和人人网上分享这个特殊的礼物,可以给情人带来惊喜和喜悦。 ...
[详细]
蜡笔小新 2023-12-12 16:25:24
git
海马s5近光灯能否直接更换为H7?
本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ...
[详细]
蜡笔小新 2023-12-12 11:39:00
git
AJAX操作授权过期的全局处理方式
本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ...
[详细]
蜡笔小新 2023-12-11 19:17:35
git
如何在跨函数中使用内存?
本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ...
[详细]
蜡笔小新 2023-12-11 19:06:43
余夫子曰
这个家伙很懒,什么也没留下!
Tags | 热门标签
webstorm
notepad++
visual
emacs
phpstorm
windows
intellij-idea
terminal
eclipse
protocols
markdown
编辑器
vim
pycharm
git
svn
ide
diff
visual-studio
clone
macos
alias
github
sublime-text
sublimetext
visual-studio-code
RankList | 热门文章
1
Kubernetes 1.21.0如何部署管理界面Dashboard 2
2
flutter样式基础
3
AutoMapper的源码分析
4
【laravel5.6】yii Process class relies on proc_open, which is not available on your PHP installation.
5
C++ Python /Go SRE 工程师。 大量 HC。 只等你简历
6
卡巴斯基KAV/KIS 6.0.1.411正式版下载 附MP1版中文汉化+注册码
7
甲方|详情_基于Go语言实现OSS文件上传(local)
8
【Codeforces 1076D】Edge Deletion | 最短路树
9
《水龙吟 西湖怀古》翻译 原文赏析诗人宋陈德武
10
字符串匹配(BF算法和KMP算法)
11
随堂练习 bash shell特性和I/O重定向及管道
12
ext 3.0 grid 单元格下拉框动态设置_关于Excel动态图表的4中做法
13
都会|坏处_[JS入门到进阶] 手写解析uin8数组的工具:解析二进制字节,太快太方便了!
14
Yii学习中。。。。。。
15
【转发】用Adobe Html5 Extension的开发详解
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有