Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa-针对框架的弱链接-忽略版本?_Objective C_Xcode_Macos_Cocoa - Fatal编程技术网

Objective c Cocoa-针对框架的弱链接-忽略版本?

Objective c Cocoa-针对框架的弱链接-忽略版本?,objective-c,xcode,macos,cocoa,Objective C,Xcode,Macos,Cocoa,我们有一个利用R框架的Cocoa应用程序。我们的目的不是随应用程序一起提供R,因为用户可能会在本地安装自己的版本。我们面临的问题是,如何正确地针对具有多个版本的框架进行弱链接 我们对它的抵抗力很弱: 在链接的二进制文件中,框架设置为可选 在生成设置>其他链接器标志中添加为-弱\u框架 在尝试使用R之前,我们在代码中执行通常的“类存在”检测 下面是发生的情况: 如果安装了与我们链接的R相同的版本,则一切正常 如果没有安装R,一切正常。我们检测到缺失,它优雅地失败了 我们的问题是,当我们链接到

我们有一个利用R框架的Cocoa应用程序。我们的目的不是随应用程序一起提供R,因为用户可能会在本地安装自己的版本。我们面临的问题是,如何正确地针对具有多个版本的框架进行弱链接

我们对它的抵抗力很弱:

  • 在链接的二进制文件中,框架设置为
    可选
  • 在生成设置>其他链接器标志中添加为
    -弱\u框架
  • 在尝试使用R之前,我们在代码中执行通常的“类存在”检测
下面是发生的情况:

  • 如果安装了与我们链接的R相同的版本,则一切正常
  • 如果没有安装R,一切正常。我们检测到缺失,它优雅地失败了
  • 我们的问题是,当我们链接到一个版本(比如3.1)时,用户有一个不同的版本(比如3.2)。然后我们得到错误
    无法解析(我的应用程序)中的符号(某些sybmol),因为无法加载依赖的dylib#1
我想这是有道理的,因为我们是针对3.1构建的,但它并不存在——3.2是。我只是不清楚如何针对这样的外部库进行适当的弱链接,并允许它使用不同的版本。或者我完全不知道该怎么做。这是完全可能的

非常感谢您的指导


谢谢

@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)
经过一番搜索,我们找到了一个新的方法,让我们知道如何将R.framework引用更改为“当前”而不是特定版本

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_工具。很高兴地报告,事情正在进行中