如何在Xcode中设置dyld_library_path

时间:2013-02-15 05:15:56

标签: xcode macos xcode4 dylib dyld

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

下的所有库
  

MyApp.app/Contents/Resources

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

  

DYLD_LIBRARY_PATH / mypath / xxx

并在Xcode Nothing中设置环境变量和参数。

但如果我运行如下的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?

编辑: 它也适用于你mannualy将所有你的库复制到客户端/ usr / lib路径...我想这也不是一个正确的方法。

1 个答案:

答案 0 :(得分:12)

设置DYLD_LIBRARY_PATH不是解决此问题的最佳方法。它正在努力解决你在dyld找到你的图书馆的错误信息。

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

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

  1. 将您在应用程序中捆绑的每个库的库标识符设置为@rpath - 相对值。您可以使用install_name_tool -id @rpath/libFoo.dylib libFoo.dylib
  2. 执行此操作
  3. 添加“复制文件”构建阶段,将库复制到应用程序包装器中。 MyApp.app/Contents/Frameworks是一个典型的位置。应避免使用MyApp.app/Contents/Resources,因为二进制文件不是通常意义上的资源。
  4. 链接应用程序时指定运行路径搜索路径。这为链接器提供了一个路径列表,用于解析在任何加载命令中遇到的任何@rpath变量。如果您要将库复制到MyApp.app/Contents/Frameworks,则需要指定@loader_path/../Frameworks的运行路径搜索路径。您可以通过应用程序目标上的Xcode中的LD_RUNPATH_SEARCH_PATHS(运行路径搜索路径)配置设置来执行此操作。
  5. 执行完所有操作后,您应该能够重新运行上面提到的otool命令,并查看库的路径是否使用@rpath - 相对路径。然后,您应该能够运行otool -lV MyApp.app/Contents/MacOS/MyApp并查看使用值LC_RPATH指定的@loader_path/../Frameworks加载命令。最后,您应该能够运行您的应用程序,并在没有设置DYLD_LIBRARY_PATH的情况下看到它在其Frameworks目录中找到库!