3

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

MyApp.app/内容/资源

我想将此路径设置为应用程序的 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 路径,它也可以工作......我想这也不是正确的方法。

4

1 回答 1

13

设置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. 您可以通过LD_RUNPATH_SEARCH_PATHS应用程序目标上 Xcode 中的(运行路径搜索路径)配置设置来执行此操作。

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

于 2013-02-27T07:51:10.313 回答