首页 > 其他分享 >链接私有库文件

链接私有库文件

时间:2023-11-24 09:56:36浏览次数:26  
标签:bin 文件 私有 so.1 链接 libtest

原文地址:https://www.cnblogs.com/liqinglucky/p/link-libso.html

当我们自己编译了个bin文件,这个文件运行依赖自己编译的私有库。在没有做链接的情况,直接运行bin文件会报错

# ./test-bin-1.0.1
./test-bin-1.0.1: error while loading shared libraries: libtest.so.1.0.1: cannot open shared object file: No such file or directory

报错原因:找不到库文件。

一、指定私有库链接

接下来的问题便是如何将bin文件与私有库链接起来。

1 指定私有库路径

原理可以参考gcc指定库路径的方法:makefile小白入门 - liqinglucky - 博客园 (cnblogs.com)

演示的文件目录如下

# tree
.
├── libtest.so             <<< 私有库文件
└── test-bin-1.0.1         <<< bin文件

最简单的就是指定成当前目录。设置如下:

export LD_LIBRARY_PATH=libary:.

如果是依赖库名是libtest.so.1.0.1,但我们编译出来的库文件名是libtest.so。那还需建立软链接。

ln -sfn libtest.so libtest.so.1.0.1

2 私有库加入系统库目录

上面的方法,私有库只能给自己的bin文件使用。更通用的应该是将私有库做成系统链接库,这样后面只要系统的bin文件需要都可以用上这个私有库。
演示的文件目录如下:

# tree
.
├── /usr/local/lib/libtest.so.1.0.2       <<< 私有库文件自带版本号,这样就可以区分不同的库版本
└── /root/test-bin-1.0.2                  <<< bin文件
  1. 拷贝库文件到系统目录
# cp libtest.so.1.0.2 /usr/local/lib/

但此时bin文件还不能链接到私有库文件。直接运行还是报错。

# ./test-bin-1.0.2
./test-bin-1.0.2: error while loading shared libraries: libtest.so.1.0.2: cannot open shared object file: No such file or directory

说明单纯把库文件放到系统目录并不能马上让bin文件找到,还需要更新系统的链接表。

  1. 更新系统库的路径,使链接新的库生效。
# ldconfig

再次测试成功!

# ./test-bin-1.0.2
Version: 1.0.2

这里引申出问题,对系统来说,运行可执行文件后查找依赖库文件有一定的顺序。可以参考:makefile小白入门 - liqinglucky - 博客园 (cnblogs.com)

上面已经原理上验证可行后,可以更进一步。经常看到linux上软件编译安装都是用make install软件安装的实质就是将库文件,bin文件拷贝到对应的系统默认执行目录。
我们也可以写一个makefile,将拷贝库到系统目录自动化完成。
链接私有库的流程总结如下:

3 遇到过的问题

直接用带版本号的库文件做链接时有提示

# ldconfig
/sbin/ldconfig.real: /usr/local/lib/libtest.so.1.0.1 is not a symbolic link
/sbin/ldconfig.real: /usr/local/lib/libtest.so.1.0.2 is not a symbolic link

解决方法:
Linux 提示 is not a symbolic link 错误解决方法 - 白菜没我白 - 博客园 (cnblogs.com)
因为libtest.so.1.0.1正常情况下应该是一个符号链接,而不是实体文集件,修改其为符号链接即可。
进入 root 用户后,执行重新赋予软链接即可,如下

ln -sf libtest.so.1.0.1 libtest.so

标签:bin,文件,私有,so.1,链接,libtest
From: https://www.cnblogs.com/liqinglucky/p/link-libso.html

相关文章

  • 7-zip的文件名编码问题
    7-zip的文件名编码问题问题概述7-zip的GUI界面不能设置文件名编码,因此会产生许多问题。例如如果将Windows的编码设置成UTF-8,所有的压缩包文件名都会乱码。即使是Windows的编码是正常的GBK,也会在解压用日语常用编码Shift_JIS进行编码的压缩包时出现乱码。问题解决使......
  • Qt之pro文件写法的详细介绍
    在Qt项目的.pro文件中,有一些特定的变量和命令,用于配置和控制项目的构建过程。以下是一些常用的变量和命令,以及它们的使用方式:1、TARGET:定义生成的可执行文件的名称。TARGET=MyApplication2、TEMPLATE:指定项目的类型,可以是"app"(应用程序)或"lib"(库)。TEMPLATE=app3......
  • .Net Core MVC超大文件上传
    后端控制器://用于保存的文件夹staticreadonlystringuploadFolder="UploadFolder";//目录分隔符,兼容不同系统staticreadonlychardirSeparator=Path.DirectorySeparatorChar;stringGetTmpChunkDir(stringfileName)=>HttpContext.Session.TryGet......
  • linux文件权限2
    基本权限ACLACL主要提供传统的UGO的r,w,x权限之外的具体权限,可以对单一用户,单一文件,或者目录进行文件权限设置ACL的基本使用方式getfacl查看权限setfacl设置权限选项-m 设定ACL的权限-x 删除某一用户或组的ACL权限-......
  • Redis深入理解-Socket连接建立流程以及文件事件处理机制
    RedisServer运行原理图Redis服务器中Socket网络建立以及文件事件模型一个redis单机,可以抗几百上千的并发,这里的并发指的就是同时可以有几百个client对这个redisserver发起请求,都需要去建立网络连接,同时间可能会有几百个redisclient通过socket和我们的redisserve......
  • Linux文件权限
    一、文件权限文件的权限针对三类对象进行定义owner属主,缩写ugroup属组,缩写gother其他,缩写o每个文件针对每类访问者定义了三种主要权限r:Read读w:Write写x:eXecute执行对于文件和目录来说,r,w,x有着不同的作用和含义:针对文件:r:读取文件内容w:修改文件内容x:执行......
  • 文件管理
    文件管理目录文件管理初识文件管理文件的属性文件内部数据应该怎样组织起来文件之间应该怎样组织起来?文件系统应该向上提供哪些功能从上往下看,文件应如何存放外存?其他需要由操作系统实现的文件管理功能文件系统管理目标设计文件系统需要考虑的主要问题什么是文件和文件系统?为什么......
  • Springboot文件上传代码笔记
    1.在src下创建filter包,包内Class名UploadFilterpackagecom.gd.filter;importorg.apache.catalina.servlet4preview.http.HttpServletRequest;importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletResponse;impor......
  • react开发 jest写单元测试 如何借助mock模拟实现接口返回文件流的下载测试
    要借助mock模拟实现接口返回文件流的下载测试,可以使用以下步骤:1.创建一个用于接收文件流的虚拟DOM元素,例如通过`document.createElement('a')`创建一个`<a>`元素。2.使用`URL.createObjectURL()`方法将文件流转换为URL。3.设置创建的虚拟DOM元素的`href`属性为URL,同时设置`dow......
  • python批量修改文件名
    需求:有几十个文件(不超过100个),要根据文件名加序号思路:用字典将关键字对应序号,再批量改文件名,代码比较简单:importospath=input("请输入需批量更名的文件夹全路径:")units={"总裁办":"01","生产处":"02","安全处":"03"}files=os.listdir(path)forfilein......