如何在Xcode中设置dyld_library_path

我是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?

编辑:
它也可以工作,如果你mannualy复制所有你的库到客户端/usr/lib路径…我想这也不是一个正确的方法来做到这一点.

解决方法

设置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.为此,您需要执行以下操作:

>将应用程序中捆绑的每个库的库标识符设置为@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目录中找到的库!

相关文章

在有效期内的苹果开发者账号(类型为个人或者公司账号)。还...
Appuploader官网--IOS ipa上传发布工具,证书制作工具跨平台...
苹果在9月13号凌晨(北京时间)发布 iOS 16,该系统的设备可...
计算机图形学--OpenGL递归实现光线追踪
Xcode 14打出来的包在低版本系统运行时会崩溃,报错信息是Li...