Xcode 为发布版本设置环境变量DYLD_FRAMEWORK_PATH最干净的方法是什么?

Xcode 为发布版本设置环境变量DYLD_FRAMEWORK_PATH最干净的方法是什么?,xcode,frameworks,environment-variables,app-bundle,Xcode,Frameworks,Environment Variables,App Bundle,我的应用包中有WebKit、WebCore和JavaScriptCore的自定义框架。我希望依赖于WebKit、WebCore或JavaScriptCore系统版本的所有其他框架也使用我的自定义版本。例如,我的自定义版本的Webkit加载私有系统框架,而私有系统框架又取决于Webkit的系统版本。这意味着我的WebKit和系统WebKit都会被加载,并且通常会在加载后不久发生崩溃 我理解应该这样做的方式是在应用程序包开始执行之前设置DYLD_FRAMEWORK_PATH环境变量(加载框架的搜索顺

我的应用包中有WebKit、WebCore和JavaScriptCore的自定义框架。我希望依赖于WebKit、WebCore或JavaScriptCore系统版本的所有其他框架也使用我的自定义版本。例如,我的自定义版本的Webkit加载私有系统框架,而私有系统框架又取决于Webkit的系统版本。这意味着我的WebKit和系统WebKit都会被加载,并且通常会在加载后不久发生崩溃

我理解应该这样做的方式是在应用程序包开始执行之前设置DYLD_FRAMEWORK_PATH环境变量(加载框架的搜索顺序可在此处找到:)。您可以使用setenv在代码中设置环境变量,但它不会对当前运行的进程生效。我必须重新启动该流程,才能使其生效。我也希望避免这种情况

所以我的问题是,在执行我的应用包之前,设置DYLD_FRAMEWORK_路径的最佳方法是什么?这也必须在发布应用程序包中起作用。是否有一种方法可以在可执行文件开始运行之前,每当有人单击我的应用程序包时运行脚本。或者还有其他建议吗


提前感谢。

我建议您使用
environment.plist
LSEnvironment
info.plist
中输入。查看下面的链接

杰夫·沃尔斯基(Jeff Wolski)直接参考了苹果公司关于该主题的文档。还提供了关于如何在Xcode中实现这一点的极好建议,包括与规范的替代方法相关联的角落案例(例如,直接为您的用户使用
~/.bash_profile

我打电话给你的原因是,你还要求提供一个可以帮助你的脚本(而赏金提供者似乎也有同样的问题)。结果是Webkit,你可能想从中挑选出来。这应该为您提供额外的指导,至少根据开发人员的说法,您应该如何正确地完成这项工作


祝您的项目好运。

WebKit目前有一个脚本为您执行此操作,名为run WebKit app。请参阅较新版本的ld了解
-dyld\u env
标志,该标志将
LC\u dyld\u环境
load命令插入二进制文件(因此基本上在应用程序执行过程中尽早应用)。也许将
-Wl,-dyld\u env,dyld\u FRAMEWORK\u PATH=/folder/encosing/WebKit/和/related/frameworks
添加到编译器标志中可以实现您想要的功能?

您所说的“所有其他框架”是什么意思?如果只是你的私有框架,你就不能把它们链接到你的私有WebKit和相关框架上吗?在我的自定义WebKit的代码堆的某个地方,如果你右键点击一个窗口(仅在OSX Lion上),就会加载DataDectors.framework,而DataDectors是一个私有系统框架(不是我自己构建的)。当这种情况发生时,DataDector取决于WebKit和JavaScriptCore的系统版本,因此一旦发生这种情况,现在将加载WebKit的两个副本,我的和系统。这会导致意外的结果和崩溃。您是否曾设法使其正常工作?我希望做一些类似的事情,但对于任何建议的方法都没有太多的运气。我最终在执行过程中设置了环境变量,然后从第一个流程启动了第二个版本的流程。然后,第一个进程完成执行,第二个进程在设置了DYLD_FRAMEWORK_路径的环境中执行。仅供参考有时调试器在正确连接到第二个进程时出现问题,通常我必须在main中留下一个断点来捕获第二个进程。info.plist只采用绝对路径,我需要将路径放在我的应用程序包中,从技术上讲,它可以移动。如果我在我的环境中设置它。plist是全局的,因为如果它是全局的,那也不好,因为其他应用程序可能会使用该环境变量。我查看了run safari脚本,该脚本可以工作,但我不确定当有人单击应用程序包时,如何强制脚本运行。我需要为我的应用程序包中的可执行文件会话设置环境变量。@MichaelWildermuth根据,存在过多的选项。至少有一个能满足你的需要,不管是不是。如果这些对您不起作用,我们将讨论其他一些选项。:)