linux系统中 库分为静态库和,Linux系统静态库与共享库

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

This article mainly introduces the statics library and shared library on Linux and has done some experiments for better comprehension.

Static library,又称为归档文档(archive). 在Linux系统中一般以.a作为后缀名.用以声明除了C语言标准库之外的库文档的目录. 这个声明是静态的,也就是说,当许多应用进程同时运行并且都是用来自同一个函数库的函数时,在内存中就会存有这个函数的多份拷贝.这将大量消耗内存和磁盘空间. 类似与Windows中的静态链接库.lib文档

共享库(shared library / dynamic library)

共享库克服了静态库的不足,典型的后缀名是.so。类似与Windows下的dll文档。

In Arch Linux, the paths of shared library files are declared in /etc/ld.so.conf. You can add your specified path into this file and then using sudo ldconfig for generating their so-name files if there is update of these library files happening.

The naming suggestion of Linux shared library

Every shared library has its filename and so-name(Short for shared Object name, 简单共享名). The following naming rules are commonly obeyed:

filename: libname.so.x.y.z

so-name: libname.so.x

x 代表了主版本号,主版本号之间不同通常是无法相互兼容的。

y 代表次版本号,可以向下兼容。

z 代表发布版本号,之间可以相互兼容。

当运行 ldconfig 命令后,系统会为制定目录下面的动态库文档新建与 so-name 同名的软链接。当编译完进程需要链接的时候,查找的就是这些对应的 so-name。可以用环境变量 LD_LIBRARY_PATH 指定so-name files所在的目录。

First experiment

Supposing that we want to create a shared library for calling function hello declared by hello.h, we start by writing our code here:

1

2

3

4

5

6

7void (const char* name)

{

printf("hello %s!n", name);

}1

2void (const char* name);

Then we compile it by gcc to generate shared lib:

1gcc hello.c -fPIC -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.1

Let me explain every option of the above command. -fPIC means generating position independent code, i.e., address jumping is relative rather than absolute. This option is required in generating library file because lib file usually locates at some place and is called by programs from other places, or the program is generated at some place but is moved to other path. -shared -o indicates a shared library file .so.x.y.z. And -Wl,-soname,libhello.so.0 specifies its so-name as ‘libhello.so.0’.

Now we check our files and should see a new file like this picture:

Next we update by ldconfig

1ldconfig -n shared-library/

Note that -n specifies the dir only being processed(Because we only created one lib file under shared-library, it has no need to update all). If you have added the path into /etc/ld.so.conf, you can also simply run sudo ldconfig and see the same change:

As we can see, the so-name symbolic link has been created. Now we can test this new lib by writing a test code:

1

2

3

4

5

6

7

8int main()

{

hello("handy");

return 0;

}

Then we create a symbolic link to the so-name file in order for gcc compiler specification:

Now we make these three stages of shared library prepared(.so, .so.x and .so.x.y.z), then we compile and link, with relevent paths specified:

1gcc main.c -I /home/shane/Experiments/shared-library/ -L. -lhello -o main

where -I specifies the path of hello.h, -L for the path of libhello.so.

Since we have specified the path of so-name to gcc compiler but have not done that for Linux executer(one of the features of shared library), an error of failing to find the so-name file appears when running the program. So we use LD_LIBRARY_PATH to set it and run again:

1export LD_LIBRARY_PATH="$HOME/Experiments/shared-library/"

More exploration

用ldd查看其依赖的动态库:

我们发现main进程依赖的动态库名字是libhello.so.0,既不是libhello.so也不是libhello.so.0.0.1。其实在生成main进程的过程有如下几步:链接器通过编译命令-L. -lhello在当前目录查找libhello.so文档

读取libhello.so链接指向的实际文档,这里是libhello.so.0.0.1

读取libhello.so.0.0.1中的SONAME,这里是libhello.so.0

将libhello.so.0记录到main进程的二进制数据里

所以你看,进程并不知道 so-name file 在哪里,我们当然要在运行进程前 specify 一波了。

Second experiment

Now we emulate the situation of updating lib files. Suppose that we modify our code:

1

2

3

4

5

6

7# include

void hello(const char* name)

{

printf("hello %s, welcome to the world!n", name);

}

Since the change is trivial, we keep the so-name when compiling:

1gcc hello.c -fPIC -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.2

Now there are two versions exist, we update by ldconfig and see the change:

The so-name file link to the new version of lib file. And we run the program and see the immediate change:

So you see, this is the significance or the essence of so-name mechanism. We don’t have to re-link the program after modifying the shared library code.

Summary

In practical production, the compilation and execution are usually departed. Generally:specify the so-name when generating shared lib files

Ensure the availability of libXXX.so file by -L and -l when linking executable program

Ensure the existence of shared lib file and use LD_LIBRARY_PATH to specify the directory of its so-name link when running program

References

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

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

相关文章

redis windows下的环境搭建

先说下安装吧!感觉这东西跟mongodb差不多,安装和布置挺简单,下载地址:https://github.com/dmajkic/redis/downloads 下载下来的包里有两个,一个是32位的,一个是64位的。根据自己的实情情况选择,…

jsp乱码

自从重装系统之后电脑运行程序总是容易出现一些微妙的乱码,一直都没有彻底解决,有时候在别的机器上运行无误的代码一到我的机器上就出现一些问题。 myeclipse编码方式怎么改都无效,每次只能再代码中加上几行转码的语句 今天终于找到罪魁祸首-…

如何使用Notepad++格式化XML文件

经常会从数据库中读到挤在一起的XML, 整理它们的格式需要使用一些工具. 比如笔者之前使用过online的tool. 后来经同事介绍, 改用VS2008的CtrlK, CtrlF来整理. 但是VS2008有点庞大, 开启起来还是有点慢, 用起来也远不如Notepad顺手. 于是笔者Google了一把. 找到了下面的步骤, 非…

联想u盘linux安装教程,联想笔记本用U盘安装 winXP系统教程

联想笔记本用U盘安装 winXP系统教程。联想笔记本是指联想集团生产的便携手提电脑。 联想集团成立于1984年,由中科院计算所投资20万元人民币、11名科技人员创办,到今天已经发展成为一家在信息产业内多元化发展的大型企业集团。今天小编将给大家介绍使用U盘…

为什么Docker是云计算必然的现在和未来

Docker所代表的Container技术,是对内核的Cgroups、namespace等内容的使用.Linux Containerlxc借助BootZdocker可以实现在Mac和Windows上运行CGroups限制容器的资源使用Namespace机制,实现荣期间的隔离chroot,文件系统的隔离Linux内核提供的限制&#xff…

linux桌面环境 mac os,在Windows或Linux桌面上使用Mac OS Dashboard Widget | MOS86

Windows Vista中引入了Gadgets,并在Windows 7中继续使用。它们允许您从最新的新闻更新到月球的各个阶段查看各种信息,并在桌面上使用一些有用的实用程序。我们以前写过一个程序,允许您在Windows XP中使用Windows 7风格的小工具和一些实用程序…

spark 笔记 16: BlockManager

spark 笔记 16: BlockManager 先看一下原理性的文章:http://jerryshao.me/architecture/2013/10/08/spark-storage-module-analysis/ ,http://jerryshao.me/architecture/2013/10/08/spark-storage-module-analysis/ , 另外,spar…

C++ stringstream介绍,使用方法与例子

C引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。   istringstream类用于执行C风格的串流的输入操作。 ostringstream类用于执行C风格的串流的输出操作。 strstream类同时可以支持C风格的串流的输入…

CheckBox控件

前台代码&#xff1a; 1 <asp:CheckBox ID"CheckBox1" runat"server" Text "苹果"/> 2 <asp:CheckBox ID"CheckBox2" runat"server" Text "柠檬"/> 3 <asp:CheckBox ID"CheckBox3" runa…

go.js中的图标(icons)的使用

2019独角兽企业重金招聘Python工程师标准>>> 1、图标库下载&#xff1a; 将icons引入&#xff1a;http://gojs.net/latest/samples/icons.js 2、样式演示 地址&#xff1a;http://gojs.net/latest/samples/icons.html 转载于:https://my.oschina.net/u/2391658/blog…

Pygame - Python游戏编程入门(1)

前言 在上一篇中&#xff0c;我们初步熟悉了pygame的控制流程&#xff0c;但这对于一个游戏而言是远远不够的。所以在这一篇中&#xff0c;我们的任务是添加一架飞机&#xff08;玩家&#xff09;&#xff0c;并且能够控制它进行移动&#xff0c;这样我们就又离目标进了一步了~…

AQS浅析

2019独角兽企业重金招聘Python工程师标准>>> AQS的原理浅析 本文是《Java特种兵》的样章&#xff0c;本书即将由工业出版社出版 AQS的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类也是在java.util.concurrent.locks下面。这个类似乎…

编程如写作

昨晚似乎是个适合写作的夜&#xff0c;不论是自己还是朋友&#xff0c;都比平常更容易被触动。看着微博上朋友们的心路&#xff0c;想写点什么却似乎找不出非常值得大书特书的主题&#xff0c;只是歪坐在电脑旁&#xff0c;喝着咖啡&#xff0c;单曲循环着仓木麻衣的《time aft…

工作环境总结(1)开发环境搭建

1、安装git 安装文件&#xff1a;Git-2.12.0-64-bit.exe 下载地址&#xff1a;https://github.com/git-for-windows/git/releases/download/v2.12.0.windows.1/Git-2.12.0-64-bit.exe 在git bash中配置&#xff0c;git bash命令行中执行&#xff08;只有使用到egit时使用&…

15款的视频处理软件免费下载

因为需要购买昂贵的视频处理软件和高性能图形计算机&#xff0c;所以视频处理是一项比较耗费金钱的技术活。正是由于这样&#xff0c;一部分人选择使用性能较好的免费在线编辑软件&#xff0c;无需太多视频处理知识便可在浏览器中剪切和编辑视频。然而&#xff0c;当我们无法连…

液位系统c语言程序,超声波自动测量物体液位系统的设计

超声波自动测量物体液位系统的设计(任务书,毕业论文15000字)摘要本系统以STC89C52单片机为核心&#xff0c;通过硬件电路连接和软件程序的编写实现通用型超声波自动测量物体液位系统的设计。其主要原理是由单片机控制超声波发射电路发射超声波&#xff0c;超声波接收电路接收遇…

android-sdk-windows版本号下载

Android SDK 4.0.3 开发环境配置及执行 近期又装了一次最新版本号的ADK环境 眼下最新版是Android SDK 4.0.3 本文的插图和文本尽管是Android2.2的 步骤都是一样的&#xff0c;假设安装的过程中遇到什么问题&#xff0c;能够留言&#xff0c;我会尽快回复&#xff01; 系统环境的…

emacs-w3m查看html帮助手册

<?xml version"1.0" encoding"utf-8"?> emacs-w3m查看html帮助手册emacs-w3m查看html帮助手册 Table of Contents 1. 使用效果2. 为什么要用emacs-w3m来查看html的帮助手册&#xff1f;3. 什么是w3m?4. 配置5. 额外资源1 使用效果 使用快捷键C-c …

工作中的问题

今天写一专题页面&#xff0c;写出的结果在各个浏览器下都不同&#xff0c;心情不好。。。 就是红线的地方老对不齐。。。 在朋友指导下改了下样式好了 右边代码结构 1 <div class"fr Img"> 2 <h3>相关专题</h3> 3 <a href"#"…

数据结构行编辑成簇 c语言,索引的数据结构及底层存储

索引是帮助数据库高效获取数据的数据结构索引的数据结构1.hash表a.利用hash存储的话需要将所有的数据文件添加到内存&#xff0c;比较耗费内存空间b.hash表存储的是无序数据&#xff0c;范围查找的时候需要挨个进行遍历&#xff0c;比较耗费时间。2.二叉树二叉树规定左子树必须…