iOS 通过 Xcode 使用 xcframework 时模拟器崩溃
iOS Simulator crash when using xcframework through Xcode
如标题所述,我在模拟器上使用 xcframework 时遇到崩溃。在此之前,我会从 lipo 命令生成一个胖文件,它在设备和模拟器上都运行良好。模拟器和设备的各个框架是通过 CMake 构建的,并生成一个 framework
文件,每个文件都有自己的 Info.plist、acknowledgements.plist,public [=39= 的目录](这是一个 C\C++ 库)和框架。然后我使用生成的框架调用 xcodebuild -framework <path-to-ios-framework>.framework -framework <path-to-ios-simulator-framework>.framework -output <output-path>.xcframework
。我看到这会生成包含 iOS 和模拟器的正确 xcframework,到目前为止一切顺利。
构建 xcframework 后,我将我的 objective-c 应用程序包含在 Xcode 项目中,并在通过 Xcode 在设备上 运行 之前开始构建。这再次没有问题。如果我为模拟器构建,它构建得很好,但是在启动应用程序时,再次通过 Xcode,我在线程 1 上得到一个 EXC_BAD_ACCESS
,堆栈跟踪中的唯一项目是 memcpy
和 _dyld_start
。如果我尝试继续,我会得到一个 SIGKILL
,唯一的输出是找不到库 @rpath/framework.framework/framework
。如果我 运行 模拟器上的应用程序没有经过 Xcode,应用程序 运行 没问题。
我的总体问题是,为什么 运行 在模拟器上通过 Xcode 会产生此崩溃,以及如何解决它。在线搜索答案使我陷入了死胡同。我正在使用第 8 代 iPad 模拟器 运行ning Xcode 12.4 运行ning iOS 14.4。 OS 是 Big Sur 11.2.1。另一个注意事项是,在我将 xcframework 包含在实际应用程序中之后,我必须在 Release 和 Debug 配置中为 iphoneos 和 iphonesimulator 指定 HEADER_SEARCH_PATHS,否则应用程序无法编译。
尝试按照此 [视频](https://www.youtube.com/watch?v=TCnhvHUcjrY).
中所示进行操作
尽量不要使用 `lipo` 并通过终端完成所有操作。
另请注意,导入框架时,需要设置值 "Embed & Sign".
我知道这是一个老话题,但直到最近才通过升级到 CMake 版本 3.21.4 解决了这个问题。看起来在 CMake 3.20 中修复了 -rpath
链接器标志的处理方式。参见 Release notes for CMake 3.20
如标题所述,我在模拟器上使用 xcframework 时遇到崩溃。在此之前,我会从 lipo 命令生成一个胖文件,它在设备和模拟器上都运行良好。模拟器和设备的各个框架是通过 CMake 构建的,并生成一个 framework
文件,每个文件都有自己的 Info.plist、acknowledgements.plist,public [=39= 的目录](这是一个 C\C++ 库)和框架。然后我使用生成的框架调用 xcodebuild -framework <path-to-ios-framework>.framework -framework <path-to-ios-simulator-framework>.framework -output <output-path>.xcframework
。我看到这会生成包含 iOS 和模拟器的正确 xcframework,到目前为止一切顺利。
构建 xcframework 后,我将我的 objective-c 应用程序包含在 Xcode 项目中,并在通过 Xcode 在设备上 运行 之前开始构建。这再次没有问题。如果我为模拟器构建,它构建得很好,但是在启动应用程序时,再次通过 Xcode,我在线程 1 上得到一个 EXC_BAD_ACCESS
,堆栈跟踪中的唯一项目是 memcpy
和 _dyld_start
。如果我尝试继续,我会得到一个 SIGKILL
,唯一的输出是找不到库 @rpath/framework.framework/framework
。如果我 运行 模拟器上的应用程序没有经过 Xcode,应用程序 运行 没问题。
我的总体问题是,为什么 运行 在模拟器上通过 Xcode 会产生此崩溃,以及如何解决它。在线搜索答案使我陷入了死胡同。我正在使用第 8 代 iPad 模拟器 运行ning Xcode 12.4 运行ning iOS 14.4。 OS 是 Big Sur 11.2.1。另一个注意事项是,在我将 xcframework 包含在实际应用程序中之后,我必须在 Release 和 Debug 配置中为 iphoneos 和 iphonesimulator 指定 HEADER_SEARCH_PATHS,否则应用程序无法编译。
尝试按照此 [视频](https://www.youtube.com/watch?v=TCnhvHUcjrY).
中所示进行操作 尽量不要使用 `lipo` 并通过终端完成所有操作。
另请注意,导入框架时,需要设置值 "Embed & Sign".
我知道这是一个老话题,但直到最近才通过升级到 CMake 版本 3.21.4 解决了这个问题。看起来在 CMake 3.20 中修复了 -rpath
链接器标志的处理方式。参见 Release notes for CMake 3.20