Linux C++ 尝试使用绝对路径加载一个特定库,而所有其他库则使用相对路径链接

2023-12-11

我有以下问题:我正在尝试创建程序的可移植版本,因此我将 rpath 设置为“。”因此所有库都使用相对文件路径链接。这确实适用于除一个库之外的所有库。由于某种原因,只有当一个特定库存在于编译时链接的同一位置时,该程序才能工作。这是我自己写的,它的rpath也设置为“.”。因此基本上,即使库与可执行文件位于完全相同的位置,程序也将拒绝启动。
我已经验证只有一个库有问题,因为如果我在测试计算机上创建我的计算机上的库所在的文件夹,程序就会启动。

linux-vdso.so.1 =>  (0x00007ffcc5961000)
libOgreHlmsPbs.so.2.1.0 => ./libOgreHlmsPbs.so.2.1.0 (0x00007fedeec3f000)
libOgreHlmsUnlit.so.2.1.0 => ./libOgreHlmsUnlit.so.2.1.0 (0x00007fedeea1d000)
libOgreMain.so.2.1.0 => ./libOgreMain.so.2.1.0 (0x00007fedee194000)
/home/marvin/workspace/HLMS_DS_DEMO/libHLMS_DS.so => not found

那么,有谁知道什么可能导致 linux 尝试在原始位置而不是像其他所有位置一样在相对位置查找该库?该程序在 Windows 上也运行良好。


我将 rpath 设置为.因此所有库都使用相对文件路径链接

Using .在 rpath 中是一个糟糕的主意:

  • 可用性:应用程序必须从特定的工作目录运行。
  • 安全性:攻击者可能会修改.so文件放在另一个目录中并从那里运行您的应用程序。

正确的方法是使用-rpath=$ORIGIN特征。看man ld.so:

$ORIGIN(或等效的${ORIGIN}) 这将扩展到包含程序或共享对象的目录。因此,位于 somedir/app 中的应用程序可以编译为

gcc -Wl,-rpath,'$ORIGIN/../lib'

这样无论 somedir 位于目录层次结构中的哪个位置,它都会在 somedir/lib 中找到关联的共享对象。这有助于创建“交钥匙”应用程序,这些应用程序不需要安装到特殊目录中,而是可以解压到任何目录中,并且仍然可以找到它们自己的共享对象。

$ORIGIN语法有点不幸,因为它被两者扩展为变量make and bash,因此您可能需要适当地引用它。


什么可能导致 linux 尝试在原始位置而不是像所有其他位置一样在相关位置查找该库

链接时,库可以指定为-lmylib or -l:libmylib.so or -l<path>/libmylib.so。在后一种情况下,运行时链接器在该特定路径中查找库<path>/libmylib.so仅有的。看man ld, 选项-l了解完整详情。您可能想检查您的构建系统链接器命令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C++ 尝试使用绝对路径加载一个特定库,而所有其他库则使用相对路径链接 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Javascript/Typescript 将默认常量导出为异步函数调用的值

    我读了很多书 但还没有找到有效的解决方案 我见过的最接近的是这里 导出React中async函数的结果 请记住 我想导出一个对象 并且该对象是异步函数的结果 而不是导出异步函数定义本身 这是到目前为止我的用例和实现 我们有一个名为 conf
  • 有没有更简洁的正则表达式来完成这个任务?

    首先 对这个蹩脚的标题感到抱歉 但我想不出更好的标题 我需要测试密码以确保以下内容 密码必须至少包含以下 3 项 大写字母 小写字母 numbers 特殊字符 这是我想到的 它有效 但我想知道是否有更好的方法来做到这一点 Dim lower
  • 从 3D Rcpp NumericVector 索引切片

    您好 我有一个关于将 NumericVector 对象视为多维数组的非常简单的 Rcpp 问题 我找不到可能显而易见的答案 如果是这种情况 请先道歉 我对 C 的经验不足是罪魁祸首 如果我使用此处发布的答案 在 Rcpp 中构造 3D 数组
  • Android 支持 JDK 6 或 7 [重复]

    这个问题在这里已经有答案了 我是 Android 开发新手 我可以在 Android 中使用使用 JDK 7 开发的现有 Java 代码吗 这些函数使用 xerces dom xslt 和 xpathapi 目前 当我安装Android E
  • 错误:控制到达非 void 函数的末尾 [-Werror=return-type] } ^

    问题基本上是从给定的 n 个数字生成一个算术表达式 并且该表达式应该能被 101 整除 我们只能有 运算符 并且表达式是左关联的 我已经尝试了所有可用的解决方案 这些解决方案已经在堆栈溢出中提到过 例如用 else 关闭表达式等等 bool
  • Vbscript msxml12.XMLHTTP错误处理

    我使用这个 vbscript 代码来下载网页 Dim oXML Set oXML CreateObject msxm12 XMLHTTP oXML Open GET mysite com False oXML Send 如果没有这样的网站
  • PHP REGEX - 通过 preg_split 在换行符处将文本转换为数组

    EDITED 需要有关拆分数组的帮助 数组示例 array 0 gt some normal text some long text here and so on sometimes i m breaking down and some n
  • TFSPreview.com 和 Azure 持续部署 TFS 中的多个解决方案

    我最近尝试了 Microsoft 的 TFS in the cloud 服务 TFSPreview com 感觉 TFS 团队终于 明白了 TFSPreview com 可能会让我们从 GIT bug 跟踪器 powershell 切换过来
  • 如何在多列上创建索引

    我们有以下实体关系 其中用户属于特定组织 我的查询看起来像 select from User where org org 或 select from User where org org and type type 我在 User 类上有单
  • 是否可以将 Nesta CMS 包含到 Rails3 应用程序中?

    我想将 Nesta CMS 应用程序 安装 到 Rails3 应用程序上 这可能是 Nesta Sinatra 应用程序的原因 它应该是机架可安装层 但是您会怎么做 你将从哪里开始 有人有关于这个话题的经验吗 建议的文档 嘿卢卡 我一两个月
  • R中如何使用函数名的字符串来调用函数?

    我正在尝试使用给定的函数名称字符串来调用函数 E g print funcList 1 2 sin works mult lt mult 5 6 1 30 不起作用 func1 lt funcList 1 func1 5 6 func2 l
  • 从 URL 获取 HTTP 响应代码的最佳方法是什么?

    我正在寻找一种从 URL 获取 HTTP 响应代码 即 200 404 等 的快速方法 我不确定要使用哪个库 更新使用精彩请求库 请注意 我们使用的是 HEAD 请求 它应该比完整的 GET 或 POST 请求发生得更快 import re
  • 将片段实例保留在 FragmentPagerAdapter 中

    是否可以保留为某个片段创建的每个片段的实例 FragmentPagerAdapter在 的里面FragmentPagerAdapter 像这样的东西 Override public Object instantiateItem ViewGr
  • 同时下载多个页面?

    我想用Python编写一个脚本 它可以从数据库中获取url 并同时下载网页以加快速度 而不是等待每个页面一个接一个地下载 根据这个线程 Python 不允许这样做 因为称为全局解释器锁这可以防止多次启动相同的脚本 在投入时间学习 Twist
  • 无法从jupyterhub/jupyter笔记本调用tensorflow gpu,为什么?

    好吧 我认为八个小时足够我自己解决这个问题 所以我只想问大家 我在 jupyterhub 和 Jupyter Notebook 之外的名为 tensorflow 的虚拟环境中运行 tensorflow gpu 1 1 0 运行得很好 也就是
  • Scrapy CrawlSpider 基于 start_urls 的动态规则?

    我正在编写一个 Scrapy 抓取工具 它使用 CrawlSpider 来抓取网站 检查其内部链接 并抓取任何外部链接 域与原始域不同的链接 的内容 我设法用两条规则来做到这一点 但它们是基于正在爬网的网站的域 如果我想在多个网站上运行它
  • 当每一侧有不同数量的项目时,将弹性项目置于一行中居中

    如何实现图片上绘制的布局 例如 左侧 3 项 一项居中 两项在右侧 ul 是橙色 黑框是项目 ul display flex width 100 ul li Item 1 li li Item 2 li li Item 3 li li It
  • scala 集合:映射列表并携带一些状态?

    我似乎一直遇到这个问题 我想修改列表中的一些元素 但我需要在这样做时保留一些状态 因此地图不起作用 这是一个例子 scala gt val l1 List a b c d e f b c e b a l1 List String List
  • Arm 板上有两个以上的 SPI 设备,但只支持两个?

    我们其中一块板上的 Arm 处理器有一个 spi 端口 带有两条片选线 该处理器的数据表中提到它最多可以控制两个 spi 设备 是否可以使用 GPIO 作为附加 spi 设备的从选择 如何修改现有的库 设备驱动程序以支持此更改 到目前为止
  • Linux C++ 尝试使用绝对路径加载一个特定库,而所有其他库则使用相对路径链接

    我有以下问题 我正在尝试创建程序的可移植版本 因此我将 rpath 设置为 因此所有库都使用相对文件路径链接 这确实适用于除一个库之外的所有库 由于某种原因 只有当一个特定库存在于编译时链接的同一位置时 该程序才能工作 这是我自己写的 它的