install_name_tool -change 和 -id 之间的区别

2023-11-27

我已经在这个概念上苦苦挣扎了一段时间,我无法真正理解两者之间的区别-change and -id.手册页指出

 -id name
              Changes  the  shared  library identification name of a dynamic shared library to name.  If the Mach-O binary is not a dynamic
              shared library and the -id option is specified it is ignored.

-change old new
              Changes  the dependent shared library install name old to new in the specified Mach-O binary.  More than one of these options
              can be specified.  If the Mach-O binary does not contain the old install name in a specified -change  option  the  option  is
              ignored.

到目前为止我已经尝试过-change。假设我有以下结构

Test.App
|_Contents
    |_MacOS
    |   |_test -----> item A
    |_Library
        |_test_library.dylib     --->item B
        |_another_library.dylib  --->item C

现在假设我在 itemB 上运行了以下命令

$ otool -L test_library.dylib
   test_library.dylib
   /some/path/another_library.dylib  -->item D

上述结果表明test_library.dylib依赖于取决于another_library.dylib现在如果我需要更改位置another_library.dylib我会这样做

install_name_tool -change /some/path/another_library.dylib some/new/path/another_library.dylib  test_library.dylib 

这会改变项目 D 的位置。我的问题是install-name_tool -id我什么时候使用它?


安装名称

期限安装名称指的是的确切路径.dylib文件存储在最终用户系统中,以便运行时链接器可以找到并加载动态库。

该名称可以是:

  • 绝对的,系统库就是这种情况。它们位于最终用户和开发人员系统上的同一位置。
  • 相对的,这是与应用程序捆绑在一起的库的情况。在最终用户的系统上.dylib将嵌入到应用程序包中,并且在开发人员系统上它们将预先内置/usr/local, /opt/local或其他地方,或者它们将作为应用程序构建的一部分从源代码构建。

后者是主要问题,因为当.dylib建成后,其安装名称被印入.dylib由链接器处理,这就是运行时找到并加载它的地方。显然,这在最终用户系统上不起作用,因为该路径仅存在于开发人员的系统上,因此解决方案是使用install_name_tool修改安装名称将应用程序包放在一起时,库以及引用这些库的可执行文件。

占位符

由于可执行文件/应用程序包可以安装在最终用户系统上的不同位置,因此您可以使用占位符系统来抽象安装名称地点:

  • @executable_path:主要可执行文件的完整路径。
  • @loader_path:引用可执行文件的完整路径或.dylib.
  • @rpath:在主可执行文件中设置的 RPATH。这也可以使用更改install_name_tool.

例如,在 macOS 应用程序包中,可执行文件位于TheApp.app/Contents/MacOS/TheApp图书馆将在TheApp.app/Contents/Frameworks所以你想使用路径引用库@executable_path/../Frameworks/Library.dylib.

最好将主可执行文件的 RPATH 设置为@executable_path/../Frameworks但是,并参考使用的库@rpath/Library.dylib.

安装名称工具

install_name_tool有两个主要选项:

-id:这设置了安装名称 of the .dylib文件本身并将用作原型安装名称从那时起,当某些东西与.dylib。你可以“纠正”安装名称构建后立即.dylib,但是这是一个不寻常的工作流程,因为图书馆如何了解使用它的环境?

-change:这改变了安装名称 of a .dylib在引用可执行文件(或 dylib)内。

-id名称不匹配.dylibs 在磁盘上的位置?没有什么。这-change选项是正确的重要选项,因为一旦运行时链接器找到了.dylib那么任务就完成了。

为什么有一个-id到底有什么名字?当然,如果链接器被告知在中查找库dirA, dirB, dirC (using -L例如)并且它找到了它正在寻找的库那么为什么库本身必须有它的-id印在里面吗?不知道;这可能是一些古老的废话。

xcode开发工具

显然,您会编写所有这些修复脚本作为构建过程的一部分,不是吗?我已经这样做并发布了它here。请参阅README.md有关如何在 Xcode 中配置它的详细信息。

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

install_name_tool -change 和 -id 之间的区别 的相关文章

  • 如何将 ios7 通用应用程序升级到基于 Xcode 6 的通用故事板应用程序?

    我目前有一个基于 xcode 5 ios 7 的通用应用程序 因此有两个故事板 我正在考虑将其更新到 ios 8 有没有办法 最佳方法将两个故事板迁移到通用的单个故事板 我在 xcode 6 中看不到转换选项 None
  • Apple Mach-O 链接器错误(静态,不是 ld)

    我最近遇到了 Apple Mach O 链接器错误 大多数指南建议将 构建设置 中的位码更改为 否 但它仅适用于 ld 错误 这与我的不同 我会提供截图 请帮忙修复bug pod HandySwift 导致了错误的出现 这是它的 Githu
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • nlohmann/json 框架中的未知断点

    一段时间以来 当我在启用断点的 Xcode 下运行我的应用程序时 我显然在名为 nlohmann basic json 的系统框架中遇到了一个未知断点 我可以毫无问题地继续执行 但这无论如何都很烦人 知道这个断点的原因是什么 或者更好的是
  • UITabBarController 为 TabBar 的每个 ViewController 提供不同的 Storyboard 文件

    我的团队正在开发一个具有 UITabBarController 的应用程序 我们正在使用 Storyboard 来开发界面和流程 由于我们是一个团队 所以我们不能将所有流程放在一个故事板中 因为这会导致与 SVN 同步出现问题 所以 解决方
  • 核心数据 iCloud 同步中的关系完整性和验证

    考虑以下简单的实体模型 实体 A 与实体 B 具有一对一关系 称为b 实体 B 具有逆对一关系 称为a 这两种关系都不是可选的 A B b lt gt a 假设我们有两个设备 1 和 2 开始完全同步 每个对象都有一个 A 类对象和一个 B
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 移动带有图像的文件夹

    我正在使用 Xcode 目前我的图像位于桌面上 将它们移至文件夹的正确方法是什么 当我只是复制粘贴它们时 我的项目不会构建 有没有简单的方法可以做到这一点 而无需将图像一一重新链接 1 在 Xcode 项目导航器中 选择要添加的项目的目标项
  • Phonegap Build 与 Xcode4 上的 Phonegap 对比?配置.xml?

    有一个使用phonegap构建的应用程序 我已经使用它编译和测试了http build phonegap com http build phonegap com服务 我发现它使用 XCode 的构建方式与在 Phonegap 网站上的构建方
  • 将通配符包标识符转换为单个 ID

    我在应用程序商店中有一个使用通配符包标识符的应用程序 我想实现应用内购买 这需要非通配符ID 如何将现有应用的通配符 ID 转换为静态 ID 以进行应用内购买和推送通知 应用程序的捆绑标识符在更新之间必须始终保持相同 但 AppID 实际上
  • 如何将 Xcode 指向旧的 SDK,以便将其用作“基础 SDK”?

    我的 Mac 的设置 Volume A 操作系统 X 10 8Xcode 4 5 或更高版本 10 6 SDKIS NOT作为基础 SDK 提供 Volume B 操作系统 X 10 7Xcode 4 3 3 10 6 SDKIS作为基础
  • Android Studio 无法在 Mac OSX (Mavericks) 上加载 JVM

    我正在尝试在我的 Mac 上设置 Android Studio 它运行的是 OSX 10 9 1 Mavericks 我已经安装了最新的 JDK 在撰写本文时为 1 7 update 45 并且安装了 Android Studio 我使用
  • 更改 UIImageView 的位置

    我怎样才能为 UIImageView 做一个简单的位置改变 假设当前坐标是 x 20 和 y 30 我想将其移至 x 100 和 y 100 可以制作运动动画吗 你需要改变它的CGFrameUIImageView就像这样 imageView
  • 如何获取 CIFilter 类中的过滤器名称列表?

    我正在使用以下代码进行曝光调整及其工作 我需要锐化 降噪 高光 色温 阴影 模糊等滤镜名称 CIFilter filterWithName CIExposureAdjust keysAndValues inputImage imageVie
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • 如何在 Mac 上禁用屏幕保护程序/显示器睡眠

    有没有办法用可可禁用屏幕保护程序和显示器睡眠 OSX 10 8 中已弃用 UpdateSystemActivity OverallAct 的使用 现在推荐的方法是通过以下调用来阻止它 IOPMAssertionCreateWithName
  • Xcode - 调试视图层次结构

    我正在尝试调试应用程序的视图层次结构 Xcode 窗口的左侧窗格中出现了一个紫色的小方块 请参见屏幕截图 知道这个问题可能是什么吗 好吧 我找到了这个问题的根源 这是一个约束问题
  • GM 发布 Xcode 6 编译

    我刚刚下载了 Xcode 6 的 GM 版本 但无法编译并出现以下错误 Command Applications Xcode app Contents Developer Toolchains XcodeDefault xctoolchai
  • Mac OS X Yosemite 中的 Node.js dtrace 错误

    我在 Mac OS X 10 10 Yosemite 上尝试使用 DTrace Node js 应用程序 sudo dtrace n profile 97 execname node arg1 jstack 150 8000 count t
  • 在 Swift 中对约束进行动画处理

    我有一个UITextField我想在点击时放大它的宽度 我设置了约束 并确保左侧约束的优先级低于我尝试在右侧设置动画的约束 这是我尝试使用的代码 move the input box UIView animateWithDuration 1

随机推荐

  • 消息“错误:资源 android:attr/lStar 未找到”

    我开发的一个Flutter Android应用今天突然编译错误 Error 什么地方出了错 任务 app processDebugResources 执行失败 Android资源链接失败 Users xxx gradle caches tr
  • Python - 尽管已安装但未找到包

    我有以下版本的python import sys print sys version 3 6 5 packaged by conda forge default Apr 6 2018 13 44 09 GCC 4 2 1 Compatibl
  • LARAVEL 9. 错误 LARAVEL 电子邮件:无法使用 STARTTLS 连接:stream_socket_enable_crypto():SSL 操作失败,代码为 1

    向社区问好 我最近开发了一个网页Laravel 9 X 它在本地工作正常 但是当我将其上传到我的主机时 我在发送电子邮件时遇到问题 我在本地测试的时候一直工作正常 一直在使用mailtrap 现在我已经将其上传到服务器 我有自己的 SMTP
  • Bash - 在变量中保存 $@ 时保持空间安全

    我在循环这样的变量时遇到问题 我准备了2个例子来说明这个问题 ex1 bin bash DIRS for DIR in DIRS do echo DIR done ex2 bin bash for DIR in do echo DIR do
  • Xcode 6.01 存档验证错误:无效的段对齐

    我一直在做一个iOS项目仅在 Xcode 中 部署目标是 iOS 8 0 更新到 Xcode 6 x 后 在我的 iPhone 5s 和 iPhone 6 以及模拟器上构建和测试工作正常 但是 当我创建存档并想要验证它时 出现以下错误 由于
  • 如何删除 CSS 换行

    我正在尝试删除text decoration line through 样式应用于我的元素 但我似乎无法这样做 我努力了text decoration none 但它不起作用 当我申请时text decoration underline t
  • 什么是 crate 属性以及在哪里添加它?

    为了了解 Rust 的工作原理 我决定看一个基于终端的文本编辑器 名为Iota 我克隆了存储库并运行cargo build只能被告知 error if let syntax is experimental help add feature
  • 在日期字段中设置日期将其设置为前一天[重复]

    这个问题在这里已经有答案了 我正在使用日期输入类型来显示 获取 HTML 表单中的日期
  • Apache POI - 单元格 setCellValue 抛出 NullPointerException

    当我尝试更新现有 Excel 文件时 遇到以下错误 Exception in thread main java lang NullPointerException at xltest main xltest java 28 My code
  • TensorFlow:从多个检查点恢复变量

    我有以下情况 我有 2 个模型用 2 个单独的脚本编写 模型 A 由变量组成a1 a2 and a3 并且写成A py 模型 B 由变量组成b1 b2 and b3 并用 B py 编写 在每个A py and B py 我有一个tf tr
  • 多个纹理图像混合到 3D 地面上

    电脑游戏如何呈现自己的阵地 我将使用几何高度图 尽管我稍后会对其进行优化 但我想知道最好的技术是什么 例如 绘制 我的地面 到处都是草 到处都是土路 城镇里有砾石 每种材料之间的过渡也很平滑 我只使用巨大的预烘焙纹理吗 当我可以平铺现有纹理
  • 当前模态视图控制器

    我刚刚开始iPhone开发 我有一个选项卡式应用程序 我想以模式方式显示登录表单 所以我看了这里苹果开发者并在我的一个视图控制器中执行此操作 我将一个按钮连接到以下操作 import LoginForm h IBAction showLog
  • WxPython:PyInstaller 失败,没有名为 _core_ 的模块

    我正在使用 PyInstaller 将 wxpython 3 0 2 0 应用程序转换为二进制文件 这些二进制文件在 Ubuntu 12 04 上构建和执行时工作正常 但是 如果我在 Ubuntu 14 04 上构建 则会收到以下错误 当我
  • 如何使用大写列名的Rails?

    我有以下内容作为 AR 查询的一部分 having COUNT foo id gt bar maxUsers 这会产生一个错误 ActiveRecord StatementInvalid PG UndefinedColumn ERROR c
  • 为什么我的 php substr() 在剪切文本时显示模糊字符?

    我正在使用substr 函数限制字符串中的字符 但有时 输出文本包含一些晦涩的字符和问号等 substred 的文本已经是 UTF8 编码的 而不是在 html 实体中出现这样的问题 Thanks 因为你正在把你的角色切成两半 Use mb
  • 需要为 EmptyStacks 创建一个新的 RunTimeException

    所以我的任务可能听起来很简单 但它让我感到困惑 我已经浏览了互联网上的代码 但我无法掌握 我也不行 掌握老师发布的幻灯片 这就是对我的要求 创建一个名为 EmptyStackException 的新运行时异常类型 然而我不知道如何制作方法
  • 如何使用元对象协议向对象添加属性?

    我试图回答this问题 并认为我可以使用元对象协议向类添加属性 这是一个我尝试添加属性的最小示例test到班级Configuration施工后 use v6 class Configuration my config Configurati
  • 核心数据中的索引关系

    我刚刚开始在 iPhone SDK 上使用 Core Data 并且正在考虑保存有序列表 例如数组 然而 核心数据中的关系在检索时表示为集合 这使得保存对象的放置顺序变得困难 一个很好的例子是允许对项目进行重新排序时表视图中的数据项目 一个
  • JSF生成的HTML元素ID是变化的,如何将其设置为固定的元素ID?

    我有一个 JSF 输入文本组件 其 id 为search 在生成的 HTML 输出中 它看起来像这样j idt17 search 但是数量17正在不时发生变化 怎样才能让它保持一成不变呢 给生成 HTML 元素的 JSF 组件id j id
  • install_name_tool -change 和 -id 之间的区别

    我已经在这个概念上苦苦挣扎了一段时间 我无法真正理解两者之间的区别 change and id 手册页指出 id name Changes the shared library identification name of a dynami