【问题标题】:How to set dyld_library_path in Xcode如何在 Xcode 中设置 dyld_library_path
【发布时间】:2013-01-31 01:43:35
【问题描述】:

我是 Xcode 和 Mac 环境的新手。我正在使用一些动态和静态库,如 boost、Clucene 等。我拥有所有的库

MyApp.app/Contents/Resources

我想将此路径设置为应用程序的 dyld_library_path。我尝试编辑 XXX.plist 文件,如

DYLD_LIBRARY_PATH /mypath/xxx

在 Xcode 中设置环境变量和参数没有任何作用。

但如果我运行如下所示的 shell 脚本而不双击 .dmg 中的应用程序,它可以工作

#!/bin/bash
clear
cd /Volumes/xxx/myapp.app/Contents/MacOS
export DYLD_LIBRARY_PATH="/Volumes/xxx/myapp.app/Contents/Resources"
./myapp

我确信这不是正确的做法。每次执行我的应用程序时是否有正确的方法来设置 dyld_library_path?

编辑: 如果您手动将所有库复制到客户端 /usr/lib 路径,它也可以工作......我想这也不是正确的方法。

【问题讨论】:

    标签: xcode macos xcode4 dylib dyld


    【解决方案1】:

    设置DYLD_LIBRARY_PATH 不是解决此问题的最佳方法。它正在解决您错误地告知dyld 在哪里可以找到您的库的事实。

    如果您运行 otool -L MyApp.app/Contents/MacOS/MyApp,您将看到 MyApp 想要加载的库的路径。如果在指定路径中未找到任何库,则dyld 将在DYLD_FALLBACK_LIBRARY_PATH 指定的位置查找库。设置DYLD_LIBRARY_PATH 会导致dyld 在上面otool 命令返回的路径之前的给定位置查找库。

    解决此问题的最佳方法是让您的应用程序指定正确的库开始位置,这样就不需要设置DYLD_LIBRARY_PATH。为此,您需要执行以下操作:

    1. 将您在应用程序中捆绑的每个库的库标识符设置为@rpath-relative 值。您可以使用install_name_tool -id @rpath/libFoo.dylib libFoo.dylib 执行此操作。
    2. 添加复制文件构建阶段以将库复制到您的应用程序包装器中。 MyApp.app/Contents/Frameworks 是一个典型的位置。应避免使用MyApp.app/Contents/Resources,因为二进制文件不是通常意义上的资源。
    3. 在链接您的应用程序时指定运行路径搜索路径。这为链接器提供了一个路径列表,用于解析它在任何加载命令中遇到的任何@rpath 变量。如果您要将库复制到MyApp.app/Contents/Frameworks,您需要指定@loader_path/../Frameworks 的运行路径搜索路径。您可以通过应用程序目标上 Xcode 中的 LD_RUNPATH_SEARCH_PATHS(运行路径搜索路径)配置设置来执行此操作。

    完成所有这些之后,您应该能够重新运行上面提到的otool 命令,并看到您的库的路径正在使用@rpath-relative 路径。然后,您应该能够运行otool -lV MyApp.app/Contents/MacOS/MyApp 并看到一个指定为@loader_path/../FrameworksLC_RPATH 加载命令。最后,您应该能够运行您的应用程序并看到它在其 Frameworks 目录中找到库,而无需设置 DYLD_LIBRARY_PATH

    【讨论】:

    • 设置 LD_RUNPATH_SEARCH_PATHS(运行路径搜索路径)对我来说是关键。
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2019-06-04
    相关资源
    最近更新 更多