将XCFramework嵌入到具有项目框架依赖性的应用程序中

时间:2020-02-05 14:49:53

标签: ios swift xcode catalyst xcframework

我有一个Xcode工作区,其中包含一个带有iOS应用程序目标的项目和另一个带有Framework目标的项目。框架目标依赖于另一个框架,该框架以xcframework的形式集成:

  • MyApp
  • MyFramework
  • OtherFramework

使用常规OtherFramework.framework要求将其链接到MyFramework,然后将其嵌入MyApp中,即使MyApp不需要框架本身。但是,当与xcframework集成时,此项目将无法构建,并出现No such module 'OtherFramework'错误。

项目设置:

MyFramework Project

MyApp Project

OtherFramework.xcframework目标中删除MyApp可以解决构建问题,但是由于该应用程序中没有该框架,因此会导致library not loaded错误。

此处的演示项目:https://github.com/msaps/XCFramework-Link-Issue

您打算如何在应用程序中链接xcframework并在依赖框架中链接?

为什么?

pyckamil刚刚发布了这篇文章,其中详细说明了该问题:Everything wrong with XCFrameworks

事实证明,Xcode对ProcessXCFrameworkLibrary步骤进行了优化,该步骤从.framework中提取了正确的.xcframework用于活动构建体系结构。只能运行一次,这会导致尝试链接同一框架的其他目标产生问题。

更新

此问题已在Xcode 12.0中解决

6 个答案:

答案 0 :(得分:1)

已更新-在Xcode 12.0中解决

shinsuk提出了一种可靠的解决方法,该方法通过添加体系结构明确的框架搜索路径来确保在XCFramework中找到正确的#[repr(C)] pub struct VPNParameters { pub address: *mut libc::c_char, pub address_size: usize, pub x: libc::c_int, } #[no_mangle] pub extern "C" fn passParameters(vpnParameters: *mut VPNParameters) { // Note the asterisk operator println!("{:?}", unsafe { (*vpnParameters).address }); }

详细信息可以在README中找到。

Search Paths

答案 1 :(得分:0)

我也有类似的问题。 首先,请确保MyFramework.framework文件与MyApp位于同一目录中。

第二,在构建MyFramework.framework时,请确保MyFramework的项目目录中还包含OtherFramework.xcframework。

还有一件事,请检查目标SDK版本。它们应该在同一水平上。

答案 2 :(得分:0)

检查构建设置,并定义指向包含相关框架的文件夹的框架搜索路径。如果将框架放在您的项目目录中,只需将框架搜索路径设置为$(SRCROOT)并将其设置为递归即可。

检查响应Getting error "No such module" using Xcode, but the framework is there

答案 3 :(得分:0)

在使用xcframework而不是framework之后,我也遇到了这个问题。因此,我更改了项目结构:

MyFramework Peoject嵌入OtherFramework.xcframework,然后使用@_exported import OtherFramework中的MyFramework Peoject将其导出。并且MyApp仅链接MyFramework,但可以导入/使用MyFrameworkOtherFramework

顺便说一句,似乎自定义了@rpath并手动对OtherFramework进行了代码签名。

答案 4 :(得分:0)

我和您有同样的问题,看到您的pbxproj后,我认为可以用相同的方法解决。

将框架搜索路径更改为递归(通过UI或手动编辑pbxproj "$(SRCROOT)/../Frameworks" => "$(SRCROOT)/../Frameworks/**"),如下所示:https://github.com/msaps/XCFramework-Link-Issue/pull/1/files

答案 5 :(得分:0)

IMO,看来不是xcframework问题。

查看以下答案:https://stackoverflow.com/a/59435627/2661407

iOS,watchOS或tvOS不支持伞框架。

OtherFramework.xcframework应该签名并嵌入到您的主机应用中。

并将“ @ executable_path / Frameworks”设置添加到MyFramework.framework>构建设置>运行路径搜索路径中。