Linux笔记之LD_LIBRARY_PATH详解

news2024/12/22 13:56:15

Linux笔记之LD_LIBRARY_PATH详解

文章目录

  • Linux笔记之LD_LIBRARY_PATH详解
    • 1.常见使用命令来设置动态链接库路径
    • 2.LD_LIBRARY_PATH详解
      • 设置 `LD_LIBRARY_PATH`
      • 举例
      • 注意事项
    • 3.替代方案
      • 使用标准路径
      • 编译时指定链接路径
      • 优先使用 rpath 还是 runpath?
      • 注意事项

1.常见使用命令来设置动态链接库路径

export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH 

命令 export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH 在类 Unix 操作系统中用来设置环境变量 LD_LIBRARY_PATH,以便在运行时包含一个含有共享库的目录。这里是命令的详细解释:

  • export:这个 shell 内置命令用来导出环境变量,这样它就可以被 shell 启动的任何子进程使用。

  • LD_LIBRARY_PATH:这是一个环境变量,动态链接器在运行时用它来找到共享库(.so 文件)。当你运行一个依赖共享库的可执行文件时,动态链接器会使用 LD_LIBRARY_PATH 中列出的目录来定位这些库。

  • =$PWD/lib:这将 LD_LIBRARY_PATH 设置为包含当前工作目录($PWD)中的 lib 目录。PWD 环境变量包含当前工作目录的路径。

  • :$LD_LIBRARY_PATH:冒号 : 是一个分隔符,它允许你将多个目录附加到 LD_LIBRARY_PATH。这部分命令将现有的 LD_LIBRARY_PATH 内容附加到新值的前面,这样新目录就会首先被搜索,然后是之前设置的目录。

综合起来,这个命令将当前工作目录的 lib 目录添加到 LD_LIBRARY_PATH 的开头,并将这个更新后的路径导出到随后执行的程序的环境中。

这在你想要运行依赖于不在动态链接器标准查找位置(如 /lib/usr/lib)的共享库的程序时非常有用。通过设置 LD_LIBRARY_PATH,你可以引导动态链接器在额外的目录中搜索。

请注意,通常认为使用 LD_LIBRARY_PATH 是最后的手段,因为如果不能将库安装到标准位置或调整动态链接器的配置文件时才会使用,因为它可能会导致版本和兼容性问题。通常最好将其用于临时或开发目的,而不是作为库路径解析的永久解决方案。

2.LD_LIBRARY_PATH详解

LD_LIBRARY_PATH 是一个环境变量,用于在Linux和类Unix操作系统中指定动态链接器搜索共享库时应查看的目录的列表。动态链接器用于加载和链接应用程序在运行时需要的共享库(动态库,通常是.so文件)。

默认情况下,动态链接器会按照一定的规则(例如查看 /lib/usr/lib 等目录)来搜索这些共享库。但是,如果你的应用程序使用了非标准路径中的共享库,或者你想覆盖默认的库版本,你可以设置 LD_LIBRARY_PATH 来告诉动态链接器在哪些额外的目录中查找。

设置 LD_LIBRARY_PATH

你可以通过在命令行中导出环境变量来设置 LD_LIBRARY_PATH,如下所示:

export LD_LIBRARY_PATH=/path/to/mylibs:$LD_LIBRARY_PATH

这里,/path/to/mylibs 应该替换为实际的目录路径。如果有多个目录,可以用冒号分隔它们。注意,$LD_LIBRARY_PATH 在末尾包括了原始的 LD_LIBRARY_PATH 值,这样可以在添加新路径的同时保留旧的路径。

举例

假设你有一个应用程序需要使用位于 /home/user/mylibs 目录中的共享库。你可以这样设置环境变量:

export LD_LIBRARY_PATH=/home/user/mylibs:$LD_LIBRARY_PATH

然后运行你的应用程序。动态链接器现在会首先在 /home/user/mylibs 目录中查找共享库,如果在那里找不到,再按照默认的规则进行搜索。

注意事项

虽然 LD_LIBRARY_PATH 很方便,但过度使用或不当使用可能会导致一些问题:

  1. 安全性:如果不小心设置了错误的路径,可能会加载到错误的库,这可能会导致安全问题或应用程序崩溃。
  2. 依赖性:依赖于 LD_LIBRARY_PATH 的应用程序可能在其他环境中运行起来比较困难,因为它需要确保环境变量被正确设置。
  3. 维护性:长期依赖 LD_LIBRARY_PATH 可能会导致维护难度增加,尤其是在多用户系统或复杂的部署环境中。

为了避免这些问题,通常推荐的做法是尽可能使用标准路径来安装共享库,或者使用如 rpathrunpath 这样的链接器选项在编译时指定库的搜索路径。

3.替代方案

为了避免使用 LD_LIBRARY_PATH 可能带来的问题,可以采用以下方法确保动态链接器能够找到共享库:

使用标准路径

将共享库安装到系统的标准路径下(如 /usr/lib/lib),这样动态链接器默认就会在这些路径下查找所需的库。这通常需要管理员权限,因为涉及到修改系统目录。

编译时指定链接路径

在编译和链接应用程序时,可以使用链接器(如 ld)的选项来指定共享库的路径。这种方法在编译时将库的路径固定到二进制文件中,减少了运行时的路径搜索和环境变量的依赖。

  • rpath: 使用 -rpath 选项可以指定运行时搜索路径,链接器会将这个路径写入到二进制文件中。例如:

    gcc -o myapp myapp.c -L/path/to/mylibs -lmylib -Wl,-rpath,/path/to/mylibs
    

    这里 -L 选项告诉编译器在哪个目录下搜索库文件,-l 选项指定库的名称,-Wl,-rpath,/path/to/mylibs 告诉链接器添加一个 rpath

  • runpath: 类似于 rpath,但是如果设置了 LD_LIBRARY_PATH 环境变量,LD_LIBRARY_PATH 会优先于 runpath。使用 runpath 的语法类似于 rpath

    gcc -o myapp myapp.c -L/path/to/mylibs -lmylib -Wl,-rpath-link,/path/to/mylibs
    

优先使用 rpath 还是 runpath?

  • 如果你希望 LD_LIBRARY_PATH 环境变量能够覆盖编译时设置的路径,使用 runpath 是一个更好的选择。
  • 如果你希望编译时设置的路径总是被使用,即使存在 LD_LIBRARY_PATH 环境变量,那么 rpath 是更好的选择。

注意事项

  • 当使用 rpathrunpath 时,要确保指定的路径是可靠和安全的。
  • 如果共享库的位置在部署后可能会发生变化,过度依赖这些选项可能会导致以后的维护问题。
  • 一些系统可能配置有安全机制,比如 SELinux,这可能会限制应用程序只能从特定的目录加载共享库。

在决定使用 rpathrunpath 还是 LD_LIBRARY_PATH 时,需要根据应用程序的具体需求和部署环境来权衡。尽可能使用标准路径或者系统包管理器来管理共享库,这样可以最小化环境设置对应用程序正常运行的影响。
在这里插入图片描述

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

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

相关文章

高级RAG:重新排名,从原理到实现的两种主流方法

原文地址:https://pub.towardsai.net/advanced-rag-04-re-ranking-85f6ae8170b1 2024 年 2 月 14 日 重新排序在检索增强生成(RAG)过程中起着至关重要的作用。在简单的 RAG 方法中,可以检索大量上下文,但并非所有上下…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

NPM私服搭建(verdaccio)

官网地址:https://verdaccio.org/ 概述 Verdaccio 是一个流行的 Node.js 包管理器的代理工具,它允许您在本地或私有网络上轻松地创建和管理 npm 包仓库。通过 Verdaccio,开发团队可以建立自己的 npm 包仓库,以更好地控制和管理其依…

Linux:Jenkins:GitLab+Maven+Jenkins的部署

1.环境 我这里准备了三台centos7 1.用于部署gitlab 运行内存:6G 名字:Jenkins-GitLab 192.168.6.1 2.用于部署jenkins 运行内存:2G 名字:Jenkins-server 192.168.6.2 3.用于打包测试…

设计模式——三大工厂模式

工厂模式 简单工厂模式(静态工厂模式) 介绍: 1、简单工厂模式是属于创建型模式,是工厂模式的一种,**简单工厂模式是由一个工厂对象决定创建出哪种产品的实例**。是工厂模式中最简单使用的模式 2、简单工厂模式&#…

ONLYOFFICE8.0——赋能办公

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-xdAoM2pHRmDFP0tF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

挑战30天学完Python:Day18 正则表达式

📘 Day 18 🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点…

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…

24款奔驰C260L升级C63包围 渣男的外观

今天店里来了一台24款奔驰C260L 一提车就过来升级 我们公司还有包上牌服务 车主说 升级完包围 帮忙安排一下 原车的包围 没有那么霸气 特别是后杠 光溜溜的 升级后 四出尾喉 尾翼 直接牌面就起来了,星骏汇小许Xjh15863

【统计分析数学模型】判别分析(四):机器学习分类算法

【统计分析数学模型】判别分析(四):机器学习分类算法 一、机器学习分类算法1. 交叉验证方法2. 案例数据集3. 数据标准化 二、决策树模型1. 基本原理2. 计算步骤3. R语言实现 三、K最邻近分类1. 基本原理2. K值的选择3. R语言实现 四、支持向量…

图像压缩感知的MATLAB实现(OMP)

前面实现了 压缩感知的图像仿真(MATLAB源代码) 效果还不错,缺点是速度慢如牛。 下面我们采用OMP对其进行优化,提升速度。具体代码如下: 仿真 构建了一个MATLAB文件,所有代码都在一个源文件里面&#xf…

MySQL——基础内容

目录 第01章_数据库概述 关系型数据库(RDBMS)——表、关系模型 非关系型数据库(非RDBMS) 表、记录、字段 表的关联关系 一对一关联 一对多关系 多对多 自我引用 第02章_MySQL环境搭建 登录命令 常用命令 show databases; create database use 数据库名 show tables 第03章…

2023最新简绘AI开源版支持MJ绘画,AI问答

应用介绍 本文来自:2023最新简绘AI开源版支持MJ绘画,AI问答 - 源码1688 简介: 简绘AI开源版,从闲鱼上买的,搭建教程如下 测试环境:NginxPHP7.4MySQL5.6 图片:

CentOS 中 RSYNC 同步分发脚本一键部署

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

ChatGpt的初步认知(认知搬运工)

前言 ChatGpt火了有一段时间了,对各行各业也有了一定的渗透,当然发展过程中也做了一些安全约束,今天主要是来跟大家分享下关于chatGpt的初步认知。 一、chatGpt是什么? ChatGPT,全称聊天生成预训练转换器(英…

如何利用AI产品写作高质量SEO文章

在搜索引擎优化(SEO)的过程中,我们的目标非常明确,即增加网站的流量并实现有效的转化。那么,如何才能吸引更多的用户访问网站呢?这时候,文章就成为了一个非常好的工具。用户可以通过阅读文章来了…

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x Projectpom.xmlOpenAPIConfigFileUploadControllerapplication.yaml Project pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…

【科普知识】什么是电机的开环和闭环

电机是现代工业和生活中不可或缺的一部分&#xff0c;无论是电动工具、电动汽车还是工业机器人&#xff0c;都离不开电机的驱动。电机的控制系统根据有无反馈信号可以分为开环和闭环两种类型&#xff0c;这两种系统各有其特点和应用场景。 01.开环控制系统 开环控制系统是电机控…

AP引擎助力加速生产SQL运行

Rapid存储引擎简介 从GreatSQL 8.0.32-25版本开始&#xff0c;新增Rapid存储引擎&#xff0c;该引擎使得GreatSQL能满足联机分析&#xff08;OLAP&#xff09;查询请求。 Rapid引擎采用插件&#xff08;Plugin&#xff09;方式嵌入GreatSQL中&#xff0c;可以在线动态安装或卸…

(九)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建ant-framework核心代码Base封装

今天重点讲解的是ant-framework核心代码Base封装过程。 因为涉及到springmvc、mybatis的集成&#xff0c;为了使项目编码更简洁易用&#xff0c;这边将基础的BASE进行封装&#xff0c;其中包括&#xff1a;BaseBean、BaseDao、BaseService、CRUD的基础封装、分页组件的封装、m…