Xcode12 - 为 iOS 模拟器构建,但链接为 macOS 构建的目标文件,用于架构x86_64的文件“dir/SomeFile.a”

Xcode12 - building for iOS Simulator, but linking in object file built for macOS, file 'dir/SomeFile.a' for architecture x86_64

提问人:Sazzad Hissain Khan 提问时间:10/1/2020 最后编辑:Sazzad Hissain Khan 更新时间:1/31/2021 访问量:8848

问:

当我尝试构建我的大型 iOS 应用程序(混合、swift+objc)时出现链接器错误。该应用程序为真实设备构建良好,但是当我尝试直接使用调试配置在模拟器中运行时,它给出了链接器错误。Xcode 12

我已经在这里的其他帖子中尝试了所有可能的解决方案,但不幸的是它没有奏效。虽然其他帖子中的错误是不同的。我已经检查了 Debug 配置的 YES 和 Release 配置的 NO。Build for active architectures only

其他过载错误,

为 iOS 模拟器构建,但链接为 iOS 构建的目标文件,用于架构 arm64

我的错误,

为 iOS 模拟器构建,但链接为 macOS 构建的目标文件、用于架构的文件x86_64

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

iOS Xcode 链接器错误 XcodeBuild Xcode12

评论

0赞 olha 10/1/2020
你办理登机手续了吗?Build for active architectures onlyBuild Settings
1赞 Sazzad Hissain Khan 10/1/2020
@Olha我已经检查了 Debug 配置和 Release 配置。该应用程序为真实设备构建良好,但是当我尝试直接使用调试配置在模拟器中运行时,它给出了链接器错误。Build for active architectures onlyYESNO
0赞 Gero 1/12/2021
这缺少一些可能很重要的信息:我假设您从包含的框架(也许是 cocoapod)中收到此链接器错误?或者它是您包含的预编译框架/库?正如你所说,你有一个 iOS 应用程序(我猜混合仅指语言),奇怪的是你甚至在那里看到了 macOS 拱门。根据框架包含在项目中的方式,您可能需要在自定义构建阶段(使用 )自己将其剥离,但没有进一步的信息,我不能这么说。lipo
0赞 Ramin 1/30/2021
我从预编译的 Fat 二进制文件中得到相同的错误,在设备上运行,在模拟器上出现错误,几周来我一直在寻找解决方法,但没有成功,第三方库的所有者没有更新它,基本上在我们的进度中钉上了钉子
0赞 swiftyboi 1/20/2022
你有没有解决这个问题?我的头撞墙已经好几天了。

答:

4赞 Eugene Dudnyk 1/13/2021 #1

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

您可以使用以下命令验证静态 (.a) 或动态库 (.dylib) 是否已针对 iOS 模拟器进行编译:

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

输出含义如下:

  • platform 7- iOS模拟器
  • platform 6- Mac 催化剂
  • platform 4- watchOS 操作系统
  • platform 2- iOS系统
  • platform 1- macOS操作系统

以下是 的枚举的完整定义。platform

评论

0赞 Ramin 1/30/2021
这样做我什么也得不到,这意味着什么?我正在使用的胖二进制文件应该针对 iOS 模拟器和 macOS 进行编译,这就是我想为什么我有同样的错误,但我没有从运行这个 otool 命令中得到 ant 结果
0赞 Eugene Dudnyk 1/31/2021
你所指的胖二进制文件是否位于框架内?如果是这样,则该部分不存在于二进制文件中,并且其中的信息位于框架的 Info.plist 中。cmd LC_BUILD_VERSION
0赞 Ramin 2/1/2021
不,它不在框架中,只是两个以旧方式创建的 .a 文件。二进制文件的原始制作者显然太忙了,两年后无法创建一个新的二进制文件,同时将其出售给人们!
0赞 Eugene Dudnyk 2/12/2021
@Ramin,它可能是使用未在二进制文件中指定此信息的旧 clang 版本编译的。而较新的版本正在链接过程中寻找它。您可以尝试做的是通过一些十六进制编辑器自行将此信息添加到二进制文件中。我想不出其他解决方案来解决您的情况。
1赞 Deeksha gupta 1/13/2021 #2

尝试在“生成设置”的“用户定义”部分的VALID_ARCHS中添加x86_64。enter image description here