Xcode 11 无法识别静态库的架构:MacCatalyst (aka UIKitForMac)

Posted

技术标签:

【中文标题】Xcode 11 无法识别静态库的架构:MacCatalyst (aka UIKitForMac)【英文标题】:Xcode 11 not recognizing static library's architecture: MacCatalyst (aka UIKitForMac) 【发布时间】:2019-10-22 02:44:25 【问题描述】:

在对 2019 年的 WWDC 公告感到兴奋后,我尝试使用 Xcode 11.0 测试版针对 MacOS 编译我现有的 ios 应用程序。不幸的是,它没有按预期进行。

Xcode 说我的静态库是为 架构构建的:

为 Mac 的 UIKit 构建,但链接库“libssl.a”是 为而建。您可能需要限制平台 此库应在目标编辑器中链接。

但是当我检查我的静态库时,我可以看到它们确实包含所需的架构 x86_64

我认为此问题可能与 Xcode Beta 错误有关。有人对此有想法吗?

【问题讨论】:

“Xcode 说我的静态库是为 架构构建的”不,它没有。它说平台。它说你有太多,而不是太少。 这里有一个可能的解决方案:forums.developer.apple.com/thread/117346。 Apple 的软件工程师 edford 说:为 iOS 模拟器构建的库需要使用 Xcode 11 重新构建,用于专门用于 Mac 的 Project Catalyst 环境——编译后的产品存在差异,并且为 iOS 模拟器构建是不够的。 【参考方案1】:

单行修复:

git clone git@github.com:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --archs="MacOSX_x86_64 i386 arm64 armv7s armv7"

解释:

根据 Apple 软件工程师 edford 的说法,我们需要为 iOS 平台构建二进制文件,目标为 MacOSX 并使用 CFLAG -target x86_64-apple-ios13.0-macabi。这里有一个非常有启发性的讨论:https://forums.developer.apple.com/message/362577。

我已经分叉了 OpenSSL-for-iPhone here 并在分支 feature/mac-catalyst 中实现了 MacCatalyst 支持。

您可以通过指定archstargetsMacCatalyst 构建它:

选项--archs,用于OpenSSL
git clone git@github.com:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --archs="MacOSX_x86_64 i386 arm64 armv7s armv7"  --version="1.0.2l"

选项 --targets 用于 OpenSSL >= 1.1.0

git clone git@github.com:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --targets="ios-sim-cross-i386 ios64-cross-arm64 ios-cross-armv7s ios-cross-armv7 mac-catalyst-x86_64" --version="1.1.0"

【讨论】:

您能分享为 UIKitForMac 构建的 OpenSSL 库吗?在我的机器上构建它时遇到问题。 嘿@bmueller,我已经更新了上面的答案。您应该能够通过调用MacCatalyst 支持重建 OpenSSL:bash git clone git@github.com:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && cd OpenSSL-for-iPhone && ./build-libssl.sh --archs="MacOSX_x86_64 i386 arm64 armv7s armv7" 谢谢!该脚本适用于 1.0.2l 版本。出于某种原因,其他版本的 Open SSL 失败了。 @marcelosalloum 我第一次尝试了 1.0.1e 版本,但一直失败。这给了我一个升级到新版本的充分理由。再次感谢。你为我节省了很多时间。 @marcelosalloum 在“iPhoneSimulator13.2-x86_64.sdk”中搜索文件失败,这些文件现在位于“MacOSX10.15-x86_64.sdk”中。没有检查代码,但假设lipoa fat lib 时会发生这种情况。 cp -r "MacOSX10.15-x86_64.sdk" "iPhoneSimulator13.2-x86_64.sdk" 解决了这个问题。【参考方案2】:

上述所有解决方案都不适用于我,所以我继续尝试为运行 Mac OSX 10.15.4 的系统修复它。

就我而言,这就是上述解决方案对我不起作用的地方:

no such sysroot directory: '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.4.sdk' [-Wmissing-sysroot]

我通读了 build-libssl.sh 文件,发现 sdk 版本是由脚本使用代码获取的:

xcrun -sdk macosx --show-sdk-version

在我的系统上确实返回:

10.15.4

使用查找器导航到该位置:

'/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

确实告诉我确实没有 MacOSX10.15.4.sdk。但是有一个 MacOSX10.14.sdk。我确实利用这些知识提出了以下解决方案:

OpenSSL 版本

版本

git clone git@github.com:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --arch="MacOSX_x86_64 i386 arm64 armv7s armv7 tv_x86_64 tv_arm64" --macosx-sdk=10.15 --version="1.0.2l"

OpenSSL 版本 >= 1.1 (1.1.0) 目前无法正常运行

版本 >= 1.1 应该只使用 --target,而不是 --arch !

git clone git@github.com:marcelosalloum/OpenSSL-for-iPhone.git --branch feature/mac-catalyst && \
cd OpenSSL-for-iPhone && \
./build-libssl.sh --targets="mac-catalyst-x86_64 ios-sim-cross-i386 ios64-cross-arm64 ios-cross-armv7s ios-cross-armv7 tvos-sim-cross-x86_64 tvos64-cross-arm64" --macosx-sdk=10.15 --version="1.1.0" -v

【讨论】:

以上是关于Xcode 11 无法识别静态库的架构:MacCatalyst (aka UIKitForMac)的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 的“po”无法识别我想研究的变量。有吗?

iOS, Xcode11,项目提示第三方库报错无法运行 bundle format unrecognized, invalid, or unsuitable

在 xcode 4.x 中添加静态库的标头搜索路径混淆?

Xcode for iPhone 中静态库和动态库的区别

xcode静态库调试

XCode 无法识别引用的 AudioKit 框架