我是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路径...我想这也不是一个正确的方法。
答案 0 :(得分:12)
设置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
。为此,您需要执行以下操作:
@rpath
- 相对值。您可以使用install_name_tool -id @rpath/libFoo.dylib libFoo.dylib
。MyApp.app/Contents/Frameworks
是一个典型的位置。应避免使用MyApp.app/Contents/Resources
,因为二进制文件不是通常意义上的资源。@rpath
变量。如果您要将库复制到MyApp.app/Contents/Frameworks
,则需要指定@loader_path/../Frameworks
的运行路径搜索路径。您可以通过应用程序目标上的Xcode中的LD_RUNPATH_SEARCH_PATHS
(运行路径搜索路径)配置设置来执行此操作。执行完所有操作后,您应该能够重新运行上面提到的otool
命令,并查看库的路径是否使用@rpath
- 相对路径。然后,您应该能够运行otool -lV MyApp.app/Contents/MacOS/MyApp
并查看使用值LC_RPATH
指定的@loader_path/../Frameworks
加载命令。最后,您应该能够运行您的应用程序,并在没有设置DYLD_LIBRARY_PATH
的情况下看到它在其Frameworks目录中找到库!