我们有一个使用R框架的Cocoa应用程序。我们的意图是不向应用程序提供R,因为用户可能会在本地安装自己的版本。我们的问题是如何正确地弱化与具有多个版本的框架的链接。
我们反对弱链接:
optional
-weak_framework
>其他链接器标志以下是发生的事情:
can't resolve symbol (some sybmol) in (my app) because dependent dylib #1 could not be loaded
。我认为这是有意义的,因为我们建立了3.1并且它不存在 - 3.2是。我还不清楚如何针对这样的外部库进行正确的弱连接,并允许它使用不同的版本。或者我完全错过了关于如何完全弱化链接的船。这完全有可能。
非常感谢任何指导。
谢谢
答案 0 :(得分:1)
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。很高兴报告事情正在发挥作用。