Cocoa - 弱框架链接 - 忽略版本?

时间:2017-07-14 21:54:10

标签: objective-c xcode macos cocoa

我们有一个使用R框架的Cocoa应用程序。我们的意图是不向应用程序提供R,因为用户可能会在本地安装自己的版本。我们的问题是如何正确地弱化与具有多个版本的框架的链接。

我们反对弱链接:

  • 框架设置为链接二进制文件中的optional
  • 在构建设置中添加为-weak_framework>其他链接器标志
  • 我们做通常的#34;班级存在"在尝试使用R之前检测代码。

以下是发生的事情:

  • 如果安装了我们链接的相同版本的R,一切正常。
  • 如果没有安装R,一切都很好。我们检测到缺席并且优雅地失败。
  • 我们遇到的问题是我们链接版本(让我们说3.1)并且用户有不同的版本(让我们说3.2)。然后我们收到错误can't resolve symbol (some sybmol) in (my app) because dependent dylib #1 could not be loaded

我认为这是有意义的,因为我们建立了3.1并且它不存在 - 3.2是。我还不清楚如何针对这样的外部库进行正确的弱连接,并允许它使用不同的版本。或者我完全错过了关于如何完全弱化链接的船。这完全有可能。

非常感谢任何指导。

谢谢

1 个答案:

答案 0 :(得分:1)

@eww和我继续调查这个问题,以及我们能够找到的内容。在编译框架和应用程序时,它们引用了特定版本的R.framework。我们能够通过运行来看到这一点:

otool -L /Applications/StatTag.app/Contents/Frameworks/RCocoa.framework/RCocoa 
/Applications/StatTag.app/Contents/Frameworks/RCocoa.framework/RCocoa:
  @rpath/RCocoa.framework/Versions/A/RCocoa (compatibility version 1.0.0, current version 1.0.0)
  **/Library/Frameworks/R.framework/Versions/3.3/Resources/lib/libR.dylib (compatibility version 3.3.0, current version 3.3.2)**
  /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1252.0.0)
  /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)
  /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1253.0.0)

经过一番搜索后,this post出现了,让我们了解如何将R.framework引用改为" Current"而不是特定的版本

install_name_tool -change /Library/Frameworks/R.framework/Versions/3.3/Resources/lib/libR.dylib /Library/Frameworks/R.framework/Versions/Current/Resources/lib/libR.dylib /Applications/StatTag.app/Contents/Frameworks/RCocoa.framework/RCocoa

我们现在可以看到它引用了当前版本文件夹:

otool -L /Applications/StatTag.app/Contents/Frameworks/RCocoa.framework/RCocoa 
/Applications/StatTag.app/Contents/Frameworks/RCocoa.framework/RCocoa:
  @rpath/RCocoa.framework/Versions/A/RCocoa (compatibility version 1.0.0, current version 1.0.0)
  /Library/Frameworks/R.framework/Versions/Current/Resources/lib/libR.dylib (compatibility version 3.3.0, current version 3.3.2)
  /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1252.0.0)
  /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1)
  /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1253.0.0)

让我们更多的事情是,当它被内置到我们的最终应用程序中时,还有其他本地框架引用RCocoa和R,这意味着我们必须多次运行install_name_tool。很高兴报告事情正在发挥作用。