不排除XCode弱链接/可选框架

问题描述 投票:0回答:3

我正在开发一个 iOS 项目。我使用的框架(UnityFramework)仅适用于设备,不适用于模拟器。我想在模拟器上运行时排除框架以便于测试,否则应用程序将无法编译。

我已按照this StackOverflow post(似乎已过时)和this Apple文档的说明弱链接框架,以便在构建模拟器时不包含它,但我仍然遇到相同的错误为模拟器构建时:找不到框架。

我不确定我是否遗漏了一些需要从模拟器构建中排除此框架的内容,或者我的配置是否有问题。我尝试在“其他链接器标志”中使用 -weak_framework 和 -ObjC -weak_framework。我正在使用 Xcode 13.3。

我的构建设置:

框架、库和嵌入内容:UnityFramework.framework - 嵌入和签名

构建设置 - 其他链接器标志 - 全部标有 -weak_framework UnityFramework

构建阶段 - 将二进制文件与库链接 - UnityFramework.framework - 可选

这是我收到的错误的片段:

Ld .../Library/Developer/Xcode/DerivedData/app-gygzddvoumbadmatpojfllhgdkag/Build/Products/Debug-iphonesimulator/AppDevelopment.app/AppDevelopment 正常(在项目“App”的目标“AppDevelopment”中) cd .../项目/应用程序文件夹

-Xlinker .../Library/Developer/Xcode/DerivedData/app-gygzddvoumbadmatpojfllhgdkag/Build/Intermediates.noindex/app.build/Debug-iphonesimulator/appDevelopment.build/Objects-normal/x86_64/appDevelopment.swiftmodule -weak_framework UnityFramework - Xlinker -sectcreate -Xlinker __TEXT -Xlinker

ld:找不到 UnityFramework 框架

ios swift xcode
3个回答
0
投票

假设您的框架名称是

YourFramework

#if !targetEnvironment(simulator) //notice the not operator (!)
import YourFramework //YourFramework will be imported only when not on simulator
#endif

它也可能值得检查

#if canImport(YourFramework)


0
投票

几小时后我发现了下一个:

  1. 在其他链接器标志中“-weak_framework”不起作用并抛出错误
    Unknown argument: '-weak_framework <name>'
    。您应该将其分成两行:
    -weak_framework
    和下一个
    "<name>"
  2. -weak_framework 仍然需要这个框架才能编译。它不排除框架。它只是让它在运行时变得懒惰。因此,如果您希望排除框架,您可能需要 EXCLUDED_SOURCE_FILE_NAMES,但就我而言,它也需要构建框架。

我仍然没有找到如何嵌入arm64框架并排除模拟器的解决方案。


-1
投票

通过以下方式解决了我的问题:

首先,将验证工作空间设置为“是”

其次,xcode 在衍生数据中寻找我的框架。我将框架复制到项目文件夹,然后通过手动将其拖入将其添加到“框架”中。

问题似乎是xcode无法在模拟器条件下构建我的框架,但它仍然需要链接它,因此它无法“找到”构建的框架。通过制作框架的副本并将其保存在项目目录中,它将不再在派生数据中查找它。可能有更好的方法通过构建脚本来完成此操作。

我现在可以在模拟器和设备上运行应用程序,并使用 #if targetEnvironment(simulator) 属性,我可以在设备上很好地访问框架的功能,并将它们留在模拟器上。

我现在在构建模拟器时收到以下警告,该警告之前没有出现:

为 iOS 模拟器构建,但链接和嵌入式框架“UnityFramework.framework”是为 iOS 构建的。

© www.soinside.com 2019 - 2024. All rights reserved.