未找到符号:启用ARC的dylib中的_objc_retainAutoreleaseReturnValue

时间:2014-01-14 17:03:25

标签: objective-c macos automatic-ref-counting

我有一个启用ARC的应用程序,它通过dlopen动态加载dylib。 dylib也支持ARC。两者都使用MacOSX SDK 10.7进行编译,部署目标为10.6。

dlopen,我得到:

Symbol not found: _objc_retainAutoreleaseReturnValue
  Referenced from: /Users/bea/Downloads/MusicPlayer.app/Contents/Resources/Python/_guiCocoaCommon.dylib
  Expected in: /usr/lib/libobjc.A.dylib

这是正确的,因为_objc_retainAutoreleaseReturnValue不在MacOSX 10.6的/usr/lib/libobjc.A.dylib中。但它在哪里?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我使用的dlopenRTLD_NOW标志。 (我在Python中通过ctypes.CDLL / ctypes._dlopen使用它,RTLD_NOW被强制使用。)

我猜你必须在MacOSX上使用RTLD_LAZY因此。当我使用RTLD_LAZY时,一切正常(到目前为止)。 看起来好像实际上没有使用符号_objc_retainAutoreleaseReturnValue。所以我想知道它为什么会存在。也许这是Apples编译器中的一个错误。 编辑:我认为这个解释是错误的。我查看了反汇编,它在我的一个方法中使用。但我想它在运行时被现有的___arclite_objc_retainAutoreleaseReturnValue取代,也在Dylib中(因此我猜libarclite_macosx.a总是自动静态链接到它)。

(我打开了一个关于Python here的问题。您可以看到我的修复here。)