首页 > 系统相关 >[Linux 高并发服务器]制作静态库与动态库

[Linux 高并发服务器]制作静态库与动态库

时间:2022-11-25 19:41:22浏览次数:40  
标签:文件 main lib 静态 Linux 并发 使用 服务器 动态


[Linux 高并发服务器]制作静态库与动态库

[Linux 高并发服务器]制作静态库与动态库

  • ​​[Linux 高并发服务器]制作静态库与动态库​​
  • ​​什么是库​​
  • ​​静态库的制作和使用​​
  • ​​命名规则​​
  • ​​静态库的制作​​
  • ​​静态库的使用​​
  • ​​动态库的制作和使用​​
  • ​​命名规则​​
  • ​​动态库的制作​​
  • ​​使用动态库​​
  • ​​静态库和动态库优缺点​​
  • ​​静态库优点​​
  • ​​静态库缺点​​
  • ​​动态库优点​​
  • ​​动态库缺点​​
  • ​​一般使用场景​​

什么是库

  • 库文件是计算机类的一类文件,可以当作代码仓库,提供给使用者一些可以直接拿来用的变量
    函数和类
  • 库不能单独运行
  • 库文件用两种:静态库和动态库(共享库),区别是静态库在程序链接阶段被复制到了程序中,动态库在链接阶段没被复制到程序当中,而是在运行时由系统动态添加到内存中使用
  • 库的好处:代码保密,方便部署和分发

静态库的制作和使用

命名规则

LINUX系统​​libxxx.a​​​,前缀lib和后缀.a固定,xxx为库名
Windows系统:​​​libxx.lib​

静态库的制作

gcc获得.o文件
将.o文件大宝,使用ar工具

ar rcs libxxx.a xxx.o xxx.o

​r-将文件插入备存文件​​​​c-创建备存文件​​​​s-创建索引​

静态库的使用

创建如下文件目录格式

[Linux 高并发服务器]制作静态库与动态库_linux


使用打包好的​​libcalc.a​​​静态库需要静态库文件本身以及​​head.h​​文件

​main.c​​文件为需要使用静态库的测试文件

使用如下命令把静态库编译链接到​​main.c​

gcc main.c -o app -I ./include -l calc -L lib

​-I​​​在哪里找头文件
​​​-l​​​指定库的名称,主要不要写成​​libcalc.a​​​,​​calc​​​才是库名
​​​-L​​到哪里找库

动态库的制作和使用

命名规则

Linux:​​libxxx.so​​​,在Linux下是一个可执行文件
Windows:​​​libxxx.dll​

动态库的制作

  • gcc 得到 .o文件,得到和位置无关的代码
gcc -c -fpic/-fPIC a.c b.c

​-fpic​​参数主要发生在编译->汇编的过程中

  • gcc 得到动态库
gcc -shared a.o b.o -o libcalc.so

​.so​​文件在LINUX下为可执行文件

使用动态库

参照静态库的使用方法输入

gcc main.c -o main -I ./include -L lib/ -l calc

但是在使用main的时候报错了

/main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory

原因是对于动态库而言,GCC进行链接是,动态库代码不会被打包到可执行文件当中
程序启动之后,动态库会被动态加载到内存中

我们可以通过​​ldd​​命令来检查动态库依赖关系

[Linux 高并发服务器]制作静态库与动态库_windows_02

当系统加载可执行带代码的时候,能够知道依赖库的名字,但还是需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由​​ld-linux.so​​来完成的(也就是图片中最后一行的玩意)

流程如下:

  1. DT_RPATH段
  2. 环境变量LD_LIBRARY_PATH
  3. /etc/ld.so.cache文件列表
  4. /lib/,/user/lib

所以就是动态库没被加载到吗,我们一个个流程去找就行了
对于DT_RPATH段,我们一般不用检查。

我们检查一下环境变量,使用​​env​​命令即可查看我们的环境变量,发现貌似没有配置LD_LIBRARY_PATH,我们添加一下

方法一:直接在终端使用export配置
这种方法是临时的配置,关掉或者换个终端就没有了

export LD_LIBRARY_PASH=$LD_LIBRARY_PASH:这里进入到动态库文件目录然后pwd获取位置粘贴到这

​tip:​​如果要查询某个环境变量的值可以用echo

echo $LD_LIBRARY_PATH

方法二:在目录下的​.bashrc​文件中添加

export LD_LIBRARY_PASH=$LD_LIBRARY_PASH:这里进入到动态库文件目录然后pwd获取位置粘贴到这

然后使用

source .bashrc

保存应用设置
注意:如果你的shell不是bash改成了zsh之类的要去相应的配置文件修改例如​​​.zshrc​​ 这种方式是用户级别的

方法三:在/etc/profile中按照方法二添加并保存

这种方式是系统级别,如果用户级别已经设置了可能会失效
我们使用​​​unset​​来删除已有的环境变量

方法四:把生成的动态库放到/lib/或者​/usr/lib​目录

不推荐这种方法,因为本身里面就有很多库

添加后重新使用​​ldd​​查询依赖,发现找到了,可以正常使用

[Linux 高并发服务器]制作静态库与动态库_动态库_03

静态库和动态库优缺点

静态库优点

  • 静态库被打包到应用程序中加载速度快
  • 发布程序无需提供静态库,移植方便

静态库缺点

  • 消耗系统资源,浪费内存(可能好几个程序用相同的静态库,都被打包进去了)
  • 更新部署发布麻烦

动态库优点

  • 可以实现进程之间资源共享(共享库)
  • 更新部署发布简单
  • 可以控制何时加载动态库

动态库缺点

  • 加载速度比静态库慢
  • 发布程序时需要提供依赖的动态库

一般使用场景

库很小的话使用静态库
库比较大的花使用动态库


标签:文件,main,lib,静态,Linux,并发,使用,服务器,动态
From: https://blog.51cto.com/u_15891800/5887533

相关文章

  • linux ftp 操作命令
    1. Linux 终端连接FTP[oracle@Dave~]$ ftp10.85.7.97Connectedto10.85.7.97.220Serv-UFTPServerv6.4forWinSockready...500'AUTH':commandnotunderstood.......
  • Linux 查看磁盘空间
    linux查看磁盘空间可以使用df和du命令。dfdf以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息。例如,我们使用df-h命令来查看......
  • 简述五种开源NAS存储服务器--转
    存储对于公司来说是必不可少的:数据必须被存储、检索、共享和保护。下面小编为大家介绍一下5款开源的NAS存储服务器一、云计算云计算正在蓬勃发展,比任何云存储系统都要快......
  • linux rabbitmq 安装方法
    1.安装erlang运行以下命令,安装erlang所需要的依赖包。yuminstall-ymakegccgcc-c++m4opensslopenssl-develncurses-develunixODBCunixODBC-develjavajav......
  • [ Linux ] 进程间通信之共享内存
    在上篇博文我们了解了通过管道完成进程间通信,我们了解匿名管道和命名管道,并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先......
  • Linux 命令 su 和 sudo 的区别
    之前一直对su和sudo这两个命令犯迷糊,最近专门搜了这方面的资料,总算是把两者的关系以及用法搞清楚了,这篇文章来系统总结一下。1.准备工作因为本篇博客中涉及到用户切换,......
  • 寻找Linux单机负载瓶颈
    服务器性能上不去,是哪里出了问题?IO还是CPU?只有找到瓶颈点,才能对症下药; 如何寻找Linux单机负载瓶颈,遵循的原则是不要推测,我们要通过测量的数据说话;负载分两类: 1.CPU负载; ......
  • 8.8.8.8,Google推出免费DNS解析服务器
    Google今天又给了我们一个惊喜,并沉重的打击了OpenDNS:他们刚刚宣布向所有的互联网用户提供一组快速,安全并且完全免费的DNS解析服务器,地址分别是:8.8.8.88.8.4.4我想这组ip看......
  • __attribute__修饰使用在linux编程中的使用
    int__attribute__((weak))func();当我们用__attribute__((weak))修饰func()函数后,func就是一个弱符号。不管外部是否定义了func()我们都可以链接通过,当外部定义了就调用外......
  • 为什么Redis 是单线程却能支撑高并发?
    最近在看UNIX网络编程并研究了一下Redis的实现,感觉Redis的源代码十分适合阅读和分析,其中I/O多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进......