我对Xcode和Mac环境很陌生。我正在使用一些动态和静态库,如boost、Clucene等。
MyApp.app/Content/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?
编辑:如果你把你所有的库拷贝到客户端/usr/lib路径,它也能工作.我想这也不是一个合适的方法。
发布于 2013-02-26 23: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
。要做到这一点,您需要执行以下操作:
@rpath
-relative值。您可以使用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
(Runpath Search )配置设置来实现这一点。在完成所有这些操作之后,您应该能够重新运行上面提到的otool
命令,并看到您的库的路径使用@rpath
-relative路径。然后,您应该能够运行otool -lV MyApp.app/Contents/MacOS/MyApp
,并看到以@loader_path/../Frameworks
值指定的LC_RPATH
load命令。最后,您应该能够运行您的应用程序,并看到它可以在其框架目录中找到库,而无需设置DYLD_LIBRARY_PATH
!
https://stackoverflow.com/questions/14888668
复制