【问题标题】:OSX: changing path of .frameworkOSX:改变.framework的路径
【发布时间】:2009-08-20 06:04:01
【问题描述】:

我的 Mac OS 应用程序与非系统提供的框架 Foo.framework 链接。我在 XCode 中添加了对框架的引用,并且应用程序构建良好。我还有一条规则,将框架复制到输出框架文件夹(MyApp.app/Contents/Frameworks)中。但是,在运行时,二进制文件会在 ~/Library/Frameworks 中寻找框架,但应用无法加载。

otool -l MyApp.app 还告诉我它正在 /Users//Library/Frameworks 中寻找框架。

谁能解释为什么会发生这种情况,以及让应用程序在应用程序包的 Frameworks 文件夹中显示的正确方法是什么?

我的 hacky 解决方法是包含一个自定义脚本,以使用 install_name_tool 更改 mach-o 二进制文件中的路径,但我确信有一种干净的方法。

【问题讨论】:

    标签: xcode macos


    【解决方案1】:

    你在正确的轨道上。

    这是因为在 OS X 上,"install_name" 在创建时会记录在库中。然后将该 install_name 复制到与其链接的任何应用程序中。

    解决问题的“最佳”方法是修改框架的源代码,以便在构建框架时设置 -install_name 链接器标志。

    但是,这通常是不可能的,要么是因为您没有源代码,要么是因为框架中有大量的 autoconf 内容,这使得它几乎是不可能的。在这种情况下,使用带有 -id 标志的 install_name_tool 来更改库中记录的 install_name

    那么,说了这么多,你要把它改成什么?

    @executable_path/../Frameworks/Foo.framework/Foo(或任何名称)

    所以,从包含 Foo.framework 的目录中:

    install_name_tool -id @executable_path/../Frameworks/Foo.framework/Foo Foo.framework/Foo
    

    在运行时,加载器会将@executable_path 解析为应用程序可执行文件的路径。显然,您还需要设置 Copy Files 构建阶段以将框架复制到应用程序包的 Framework 文件夹中。

    您还可以使用带有 -change 标志的 install_name_tool 来更改已链接到应用程序的库的 install_name,但这显然不是最佳的。在链接之前修复它。

    【讨论】:

    • 好的,这正是我一直在做的。感觉破了我想 Apple 可以向 XCode 添加一些东西,允许开发人员在指定要链接的新框架时设置运行时路径。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2013-02-05
    • 2012-05-17
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多