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?
编辑:
它也可以工作,如果你mannualy复制所有你的库到客户端/usr/lib路径…我想这也不是一个正确的方法来做到这一点.
解决方法
如果您运行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-relative路径.然后,您应该能够运行otool -lV MyApp.app/Contents/MacOS/MyApp并查看使用@loader_path /../ Frameworks值指定的LC_RPATH加载命令.最后,您应该能够运行您的应用程序,并在没有设置DYLD_LIBRARY_PATH的情况下查看它在其Frameworks目录中找到的库!