在库的Mac OS X SDK中包含调试版本

时间:2010-01-24 14:53:12

标签: xcode macos frameworks

我相信您已经意识到在SDK中包含调试和发布版本的库是很常见的。我的问题是,对于Mac OS X框架,在分发和可能的Xcode集成方面是否存在标准的方法?

一种选择是发布第二个完全独立的框架,例如MyLibrary.frameworkMyLibraryDebug.framework。如果这是正确的方法,是否有一些技巧告诉Xcode使用正确的?在向Xcode项目添加框架时,它似乎没有选择只将它添加到单个构建配置中,并且似乎不得不手动将正确的-framework MyLibrary[Debug]命令行选项放入各自的配置!

感谢。

1 个答案:

答案 0 :(得分:3)

Mac OS X动态链接器(dyld)具有完全出于此目的的功能:DYLD_IMAGE_SUFFIX。它允许您动态加载您链接到的任何框架或共享库的调试版本。那么你不需要一个完全独立的.framework捆绑;只需创建另一个名为MyLibrary_debug的共享库。例如,Tiger中的CoreFoundation包括调试和分析变体(看起来它们没有收到安全更新,但无论如何):

% ls -l /System/Library/Frameworks/CoreFoundation.framework/Versions/A/
total 20080
-rwxr-xr-x    1 root  wheel       1M Sep 10 17:55 CoreFoundation*
-rwxr-xr-x    1 root  wheel       6M Apr 24  2007 CoreFoundation_debug*
-rwxr-xr-x    1 root  wheel       2M Apr 24  2007 CoreFoundation_profile*

对于Apple的框架,标准的“debug”后缀为_debug。 (Xcode中可执行文件的“常规”窗格中的“在加载框架时使用[debug]后缀”设置设置DYLD_IMAGE_SUFFIX=_debug)。

您可能认为使用_debug也是一个好主意,但我建议您不要这样做,因为Apple已多次破坏其_debug版本的框架some examples)。从Leopard开始libSystemlibmxlibmathCommon都带有调试版本,但在Snow Leopard中它们再次崩溃(我自己遇到了this problem)。

如果为调试库选择不同的后缀,则不应触发Apple的错误,并且仍然能够在正常变体和调试变体之间共享框架的其余部分(标题,资源等)。