TL; DR;
リリースモードであっても、ライブラリ/アプリの[アクティブなアーキテクチャのみをビルドする(ONLY_ACTIVE_ARCH
)]を[はい]に設定します。
問題の根本原因を特定しようとしているときに、Xcode12に関するいくつかの面白い事実に気づきました。
Xcode 12は、実際にはApple Siliconの足がかりであり、残念ながらまだ利用できません。しかし、そのプラットフォームでは、現在のIntelベースのx86_64アーキテクチャとは異なり、シミュレータもarm64アーキテクチャで実行されるarm64ベースのmacOSを取得します。
Xcodeは通常、「実行先」に依存してライブラリ/アプリを構築します。したがって、シミュレーターが「実行先」として選択されると、使用可能なシミュレーターアーキテクチャー用にアプリがビルドされ、デバイスが「実行先」として選択されると、デバイスがサポートするアーキテクチャー用にビルドされます(arm*
)。
xcodebuild
、Xcode 12+ビルドシステムではarm64
、シミュレータの有効なアーキテクチャと見なされます。したがって、実行先としてシミュレーターが選択されると、arm64
ベースのシミュレーターに対してもライブラリ/アプリをコンパイル/リンクしようとする可能性があります(まだ利用できません)。そのため、<architecture>-<os>-<sdk>-<platform>形式のclang(++)
ようarm64-apple-ios13.0-simulator
にいくつかの-targetフラグを送信し、clangはarm64ベースのシミュレーターに対してビルド/リンクを試みますが、最終的にはIntelベースのMacで失敗します。
ただし、xcodebuild
これはリリースビルドに対してのみ試行します。どうして?なぜなら、「アクティブなアーキテクチャのみをビルドする(ONLY_ACTIVE_ARCH
)」ビルド設定は、通常、「リリース」構成の場合のみ「いいえ」に設定されるためです。つまりxcodebuild
、リリースビルド用に選択した実行先のライブラリ/アプリのすべてのアーキテクチャバリアントをビルドしようとします。そして、シミュレータの実行先のために、それは両方が含まれますx86_64
とarm64
、今以降arm64
のXcode 12+でも、シミュレータでサポートされているアーキテクチャであるアップルシリコンをサポートします。
簡単に言えば、Xcodeは、コマンドラインxcodebuild
(デフォルトではビルドをリリースします。プロジェクト設定の[一般]タブを参照)を試行するたびにアプリのビルドに失敗し、実行先でサポートされているすべてのアーキテクチャバリアントをビルドしようとします。したがって、この問題の簡単な回避策は、リリースモードの場合でも、ライブラリ/アプリで[アクティブなアーキテクチャのみをビルドする(ONLY_ACTIVE_ARCH
)]を[はい]に設定することです。
ライブラリがポッドとして含まれていて、アクセスできる場合は、次のように.podspec
設定するだけです。
spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'}
spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'YES'}#推奨されません
ポッドがターゲットプロジェクトを汚染してはならず、ターゲット設定自体でオーバーライドされる可能性があるため、私は個人的に2行目が好きではありません。したがって、何らかの方法で設定を上書きするのは、コンシューマープロジェクトの責任です。ただし、これはpodspecのリンティングを成功させるために必要な場合があります。
ただし、にアクセスできない場合.podspec
は、ポッドのインストール中にいつでも設定を更新できます。
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
私が懸念していたことの1つは、実際にlibs / appsをアーカイブするときにこれがどのような影響を与えるかということです。アーカイブ中、アプリは通常「リリース」構成を取ります。これにより、現在の実行先のアクティブなアーキテクチャのみを考慮したリリースビルドが作成されるため、このアプローチでは、ターゲットビルドからarmv7、armv7sなどのスライスが失われる可能性があります。ただし、ドキュメントには、特定のアーキテクチャが定義されていないため、実行先として「汎用iOSデバイス/任意のデバイス」を選択すると、この設定は無視されると記載されていることに気付きました(添付の画像で強調表示されています)。ですから、実行先としてそれを選択してアプリをアーカイブすれば、私たちは良いはずだと思います。