で、結局何したら直るの
ググってもググっても、何やっても消えない「Apple Mach-O Linker Error」と「linker command failed with exit code 1」のお話です。きっと、ここで書いている内容をやってみても、直らないかもしれない。けど、参考になるかもしれない。やったことと、参考にしたサイトをまとめておきます。
※私の体験で決定的だった解決策は、一番下に書いておきます。
前提条件
- CocoaPodsを使用したプロジェクト
- ライブラリへのパスは間違っていない(はず)
- CocoaPodsはとりあえずは最新版にした
1. そもそも……開くファイル間違えていないか
CocoaPodsを使用しているプロジェクトでは、「.xcodeproj」のファイルから開くとビルドできません。「.xcworkspace」を開きます。ここがまず第一のハマりどころ。
参考:初めてのCocoaPodsでLinker command failed with exit code 1でハマる
2. pod update、pod install したか
他人が作業を進めているブランチをcheckoutした場合に、よく遭遇します。まずは落ち着いてpod install
またはpod update
しましょう。ビルドに必要なライブラリをローカルに導入します。
3. 不要な“\”が入っていたりしないか、$(inherited)になっているか
pod install
をすると、下のようなメッセージが出てきます。
[!] The `[プロジェクト名]` target overrides the `OTHER_LDFLAGS` build setting defined in `[GHUnitのパス]'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.
OTHER_LDFLAGSの設定がオーバーライドされてますよ、という話のようで、たまに問題を起こすから、「$(inherited)」にしておくと良いよ、という話です。
この設定を確認するには、Project Navigatorからプロジェクトを選択し、Build Settingの一覧で「OTHER_LDFLAG」で検索します。
参考:
- U2Kの覚え書き, 【Xcode】【iOS】ライブラリ導入時のApple Mach-O Linker Error. library not found for -l curl【謎のエラー?】
- clang: error: linker command failed with exit code 1
4. 【決定打】ビルドするアーキテクチャの設定を、プロジェクトとPodsともに揃える
このエラーを抜け出す決定打だったのが、この設定でした。下に参考したサイトを挙げておきます。
Podsとプロジェクトの、「Build Active Architecture Only」の項目を、どちらもYesまたはNoに統一してくださいということだそうです。CocoaPodsのTroubleShootingにも書いてありました……。
Podsの方を選択した時も、確認する場所は2箇所!
どちらもNoになっていると思っても、Podsの方がYesになっていることがよくあるので、気をつけてください!
「Build Active Architecture Only」の設定は、必要なアーキテクチャのみでビルドするかどうかを設定する項目です。例えば、プロジェクトが「no」、Podsが「yes」のように異なった設定になっていると、ビルド時に「ライブラリが足りません、ありません」とエラーが発生するようです。
そんなの気付かないよ……> <
参考:
- stackoverflow, CocoaPods arm64 issue
- CocoaPods Troubleshooting
- Qiita, cocoapodsを導入したプロジェクトでアーキテクチャ周りのビルドエラーになる時
以上が、私の「Apple Mach-O Linker Error」と「linker command failed with exit code 1」と戦った、記録です。戦いの参考になればと思います。