欢迎大家来到IT世界,在知识的湖畔探索吧!
如果你开发的iOS 应用中使用了自己开发或第三方的动态链接库 .dylib,在程序打包时需要将该库嵌入到程序包的 Frameworks 目录中,以便程序运行时可以载入这个库来使用。当你想发布该应用并上传到 Apple Connect 审核时,会出现 Invalid Binary 错误,具体的错误信息为:
ITMS-90426: Invalid Swift Support – The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it.
意思是你的应用包中缺失了 SwiftSupport 目录。其实这个信息并不准确,我就在网上查找如何补上这个所谓的 SwiftSupport 目录,弄了好久才明白,原来是应用中使用了一个第三方的动态链接库 .dylib,这个库需要在发布时嵌入到应用程序包里的 Frameworks 目录中,错误由此而生,看看 Apple 文档时如何说的:
“Dynamic libraries outside of a framework bundle, which typically have the file extension .dylib, are not supported on iOS, watchOS, or tvOS, except for the system Swift libraries provided by Xcode.”
意思是 iOS等平台不允许在 Frameworks 目录内放置 .dylib 库(之前是可以的)。要解决这个问题,需要把第三方的 .dylib 转换为 iOS 平台的 .framework 库。
以下以 libonnxruntime-genai.dylib 为例,将其转换为 libonnxruntime-genai.framework。
- 生成 libonnxruntime-genai.dylib 对应的二进制文件 libonnxruntime-genai
转到 macOS 终端,进入 libonnxruntime-genai.dylib 所在目录,键入命令:
lipo -create libonnxruntime-genai.dylib -output libonnxruntime-genai - 生成 framework 目录
iOS 平台下的 .framework 库实际上是一个目录,其中包含了实际的库文件及相关信息,因此我们创建如下结构的目录:
欢迎大家来到IT世界,在知识的湖畔探索吧!
- 生成 framework 目录内必要的文件
最基本的 Info.plist 文件内容:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>BuildMachineOSBuild</key>
<string>23F79</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>libonnxruntime-genai</string>
<key>CFBundleIdentifier</key>
<string>com.yourdomain.onnxruntime-genai</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>libonnxruntime-genai</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>iPhoneOS</string>
</array>
<key>CFBundleVersion</key>
<string>1</string>
<key>MinimumOSVersion</key>
<string>17.0</string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
</dict>
</plist>
module.modulemap 文件内容:
framework module libonnxruntime-genai {
umbrella header “onnxruntime_c_api.h”
export *
}
4. 修改二进制文件内的 @rpath
以上生成的 framework 库文件,如果这就拿来放到iOS 项目中编译链接,是不会有语法错误的,但在运行时会出运行时错误:
error: dyld: Library not loaded: @rpath/libonnxruntime-genai.dylib
这是因为 framework 中的二进制文件 libonnxruntime-genai 内含有iOS 程序运行时如何载入该库的路径:@rpath/libonnxruntime-genai.dylib,这显然是有问题的。动态库内的 @rpath 等信息可以用以下命令查看:
otool -l libonnxruntime-genai
把它修改成正确的路径,转到 libonnxruntime-genai.framework 目录:
install_name_tool -id @rpath/libonnxruntime-genai.framework/libonnxruntime-genai libonnxruntime-genai
将修改后的 libonnxruntime-genai.framework 文件导入Xcode 你的iOS 项目中使用即可。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/96250.html