【转帖】Windows与Linux系统下的库介绍

Windows与Linux系统下的库介绍

http://embeddedlinux.org.cn/emb-linux/entry-level/200903/12-553.html

库的定义

库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

无论在Windows平台还是Linux平台下都存在大量的库,但由于Windows和Linux的本质不同,因此二者的库的二进制是不兼容的。

库的分类

Windows下的库有两种:静态库(.lib)和动态链接库(.dll)。

Linux下的库有两种:静态库(.a)和共享库(.so)。

Linux下的静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称

Linux下的动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号,minor是副版本号。

Windows下的库与Linux下的库的异同

Linux 的共享库(.so)就象Windows的动态链接库(.dll),它里面包含有很多程序常用的函数。为了方便程序开发和减少程序的冗余,程序当中就不用包 含每个常用函数的拷贝,只是在需要时调用共享库中常函数即可。这种方式我们称之为动态链接(Dynamically Linked)。而有时我们不希望叫程序去调用共享库的函数,而是把库函数代码直接链接进程序代码中,也就是说,在程序本身拥有一份共享库中函数的副本。 这种方式我们称之为静态链接(Statically Linked)。

所以,简单的讲静态库和共享库(动态库)的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

Windows下的动态链接库(.dll)与Linux下的共享库(.so)的差别

.dll文件事实上和.exe文件一样,同属 PE 格式的执行文件。对于隐式的引用外部符号,需要把外部符号所在的位置写在PE头上。PE加载器将从PE头上找到依赖的符号表,并加载依赖的其它.dll文件。

而在Linux 上并非如此!.so文件大多为elf执行文件格式。当它们需要的外部符号,可以不写明这些符号所在的位置。也就是说,通常.so文件本身并不知道它依赖的那些符号在哪些.so里面。这些符号是由调用dlopen的进程运行时提供的。

我 们在Windows下做一个.dll文件时还需要携带一个.lib文件;而在Linux下一般只需要有相应的头文件就够了。对于编写新的.so,找不到的 符号可以就让它在那里,直到最终执行文件来把所有需要的符号联合到一起。windows 可以存在一个.dll对另一个.dll的隐式依赖;而Linux下一般不需要让.so和.so有隐式依赖关系。

本文永久更新链接:http://embeddedlinux.org.cn/emb-linux/entry-level/200903/12-553.html

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/11361099.html

时间: 2024-11-03 23:35:26

【转帖】Windows与Linux系统下的库介绍的相关文章

Linux系统下动态库的生成

Linux系统下动态库的生成 一.简述 Linux下动态库文件的扩展名为 ".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作libthread.so.静态库的文件名形式是libname.a.共享archive的文件名形式是libname.sa.共享archive只是一种过渡形式,帮助人们从静态库转变到动态库.      小编综合自己学习体会以及网络上较好的内容,以简单的例子介绍动态库文件的生

redis在windows和Linux系统下的下载、安装、配置

1.下载redis安装包 在redis的官网只有Linux系统下的安装包,微软的GitHub上有提供windows版本的redis安装包 redis中文网:http://www.redis.cn/ 微软redis GitHub网址:https://github.com/MSOpenTech/redis/releases 链接:https://pan.baidu.com/s/1d3fCshRXT0UBYiNejbehMA 提取码:t4l72.Windows安装 将ZIP包解压到安装路径的redis

TeamCity安装Agent(Windows和Linux系统下)

这个迭代刚好要在做TeamCity迁移工作,也算边工作边学习吧,把遇到的问题记录下来,希望能帮到有需要的胖友. 一.Windows系统下 安装与配置Agent 1.先在TeamCity服务中的导航栏中点击Administration,点击Install Build Agents,下载相应的Agent版本: 2.右键agentInstaller.exe,选择以管理员身份运行,弹出窗体如下: 3.点击Next: 4.点击I Agree,选择安装后台服务: 5.点击Next,选择安装位置: 6.设置T

Windows和Linux系统下并行计算环境MPI和OpenMP的搭建

目录 windows平台下在Visual Studio2019配置MPI环境 MPI下载安装 项目配置 测试 Linux下配置MPI编程环境-Ubuntu 18.04 终端配置过程 Windows系统下OpenMP配置 visual studio2019配置 测试 windows平台下在Visual Studio2019配置MPI环境 MPI下载安装 MPI windows版本的下载地址:https://docs.microsoft.com/en-us/message-passing-inter

【Linux笔记】细说linux系统下共享库的命名规范和使用方法

1. Shared Library的优势 共享库,又称动态库或so文件,顾名思义,它可以在可执行文件启动时加载或进程运行期被调用.使用共享库有很多好处,例如(包含但不限于下面提到的场景): 1) 减少了依赖共享库的模块的大小,因为它们不必把共享库提供的功能的实现代码静态编译到自己的模块代码中. 2) 在同一台机器上运行的多个进程会在内存中共享同一份动态库,操作系统采用的这种内存布局方式可以极大地节省机器内存资源. 3) 若很多模块依赖了以共享库形式提供的同一个底层库,则底层库升级时,只需升级该s

linux系统自带函数库介绍

1 概述 /etc/init.d/functions这个这个系统自带的函数库在/etc/init.d里,很多脚本执行的时候会调用这里的函数. 这个文件首先会设置umask,path,还有语言环境等,然后会设置success,failure,warning,normal四种情况下的字体颜色. 该文件共定义了33个函数 本文将针对CentOS6S上的一些函数的用法进行介绍 2 函数介绍 daemon 启动某个服务.这里的服务名 都是放置/etc/init.d路径下的启动脚本的文件名,如ntpd 函数

windows系统正常但linux系统下找不到文件的问题

问题描述:最近一个项目开发环境是windows系统,正式环境是linux系统.验证码图片在开发环境正常,但是在正式环境下一直报404. 问题原因:File dir = new File(realPath + "resource\\picture"); 这一句文件路径写法有问题,linux系统不支持反斜杠的写法. 解决方法:将\\改为/即可,这样在windows系统与linux系统下均正常.正确写法:File dir = new File(realPath + "resourc

Nginx在Windows系统和Linux系统下的重启

一.Windows系统下重启nginx 1.杀掉nginx进程 tskill nginx echo 已终止所有ginx进程 2.启动nginx cd f:\nginx-1.0.5  nginx.exe -t nginx.exe -v start nginx.exe echo nginx已启动 二.Linux系统下重启nginx [[email protected]]#cd /web/webserver/nginx [[email protected]  nginx]# sbin/nginx  -

linux系统下运行java项目的脚本编写

本文主要讲linux系统下运行jar包,至于如何打包jar包,放到linux系统下可以参考其他的博客. 在linux系统下运行jar包的命令如下: 1.java -jar xxxxx.jar  // 当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 2.java -jar xxxxx.jar &   //当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行. 3.nohup Java -jar xxxxxx.jar &  //意思是不挂断运行命令,当账户退