Xcode12 - 为 iOS 模拟器构建时,却链接了在 macOS 上构建的目标文件,文件 'dir/SomeFile.a' 针对架构 x86_64。

6
在尝试在模拟器中使用Debug配置运行时,我正在构建我的大型iOS应用程序(混合的,Swift+ObjC)时,在Xcode 12中遇到链接器错误。该应用程序在真实设备上构建良好,但是在直接在模拟器中运行时会出现链接器错误。
我已经尝试了其他帖子这里中的所有可能解决方案,但不幸的是它没有起作用。虽然其他主题中的错误不同。我已将仅为活动架构构建设置为Debug配置为YES,Release配置为NO。
其他主题中的错误:

building for iOS Simulator, but linking in object file built for iOS, for architecture arm64

我的错误:

building for iOS Simulator, but linking in object file built for macOS, file for architecture x86_64

我该如何解决这个问题?我需要在iOS真实设备和模拟器中运行。

你是否在“构建设置”中检查了“仅针对活动架构构建”? - olha
1
@Olha 我已经检查了Build for active architectures only,对于Debug配置设置为YES,对于Release配置设置为NO。该应用程序在真实设备上构建良好,但是当我尝试使用Debug配置直接在模拟器上运行时,它会出现链接器错误。 - Sazzad Hissain Khan
这里缺少一些可能很重要的信息才能回答:我假设您从一个包含的框架中得到了这个链接器错误,也许是一个cocoapod?还是您包含的预编译框架/库?由于您说您有一个_iOS_应用程序(我猜混合只是指语言),所以在那里看到macOS arch真的很奇怪。根据框架在项目中的包含方式,您可能需要在自定义构建阶段(使用lipo)中将其剥离,但是没有更多信息,我无法确定。 - Gero
我从预编译的 Fat 二进制文件中得到了相同的错误,它可以在设备上运行,但在模拟器上出错。我已经寻找解决方法几周了,但没有成功,第三方库的所有者也没有更新它,基本上阻碍了我们的进展。 - Ramin
你解决了吗?我已经为此苦恼了好几天了。 - swiftyboi
2个回答

4

无论你从哪里获得你的库,你都应该请求为iOS模拟器编译的库,而不是macOS,尽管它们具有相同的二进制架构,可以通过lipo -info <file>返回。

您可以使用此命令验证您的静态(.a)或动态库(.dylib)是否为iOS模拟器编译:

otool -l <path-to-library> | grep platform

输出结果的含义如下:
  • platform 7 - iOS 模拟器
  • platform 6 - Mac Catalyst
  • platform 4 - watchOS
  • platform 2 - iOS
  • platform 1 - macOS

这里platform 枚举的完整定义。


我这样做却没有得到任何反馈,这是什么意思?我使用的这个fat二进制文件应该编译为iOS模拟器和macOS,这就是为什么我有相同的错误,但我在运行这个otool命令时没有得到任何结果。 - Ramin
你所指的fat binary是否位于框架内?如果是的话,二进制文件中不存在cmd LC_BUILD_VERSION部分,相关信息存储在框架的Info.plist文件中。 - Eugene Dudnyk
不,它不在框架中,只是通过传统方式创建的两个.a文件。显然,二进制文件的原始生产者在过去两年中忙于向人们销售此产品,因此没有时间创建新的文件! - Ramin
@Ramin 如果是这样,那么它可能是使用旧版本的clang编译的,该版本在二进制文件中没有指定此信息。而新版本在链接期间正在寻找它。您可以尝试通过某些十六进制编辑器自己将此信息添加到二进制文件中。我想不出其他解决方案来解决您的情况。 - Eugene Dudnyk

1
在构建设置的用户定义部分中,尝试将x86_64添加到VALID_ARCHS中。 在此输入图片描述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接