首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Xcode中设置dyld_library_path

如何在Xcode中设置dyld_library_path
EN

Stack Overflow用户
提问于 2013-02-15 05:15:55
回答 1查看 16.3K关注 0票数 3

我对Xcode和Mac环境很陌生。我正在使用一些动态和静态库,如boost、Clucene等。

MyApp.app/Content/Resources

我想把这个路径设置为应用程序的dyld_library_path。我试着编辑XXX.plist文件,比如

DYLD_LIBRARY_PATH /mypath/xxx

并在Xcode中设置环境变量和参数,没有任何效果。

但是,如果我像下面这样运行一个shell脚本,而不双击我的.dmg中的应用程序,它就能工作。

代码语言:javascript
代码运行次数:0
运行
复制
#!/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路径,它也能工作.我想这也不是一个合适的方法。

EN

回答 1

Stack Overflow用户

发布于 2013-02-27 07:51:10

设置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的运行路径搜索路径。您可以通过应用程序目标的Xcode中的LD_RUNPATH_SEARCH_PATHS (Runpath Search )配置设置来实现这一点。

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14888668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档