React Nativeのバージョンアップで、"Apple Mach-O Linker (ld) Error Group!"というエラーが出て、2日ほど悩んだので、解決方法をメモしておきます。
発端
React Native 0.41.2 -> 0.45.0に↓の手順に従って、react-native-git-upgradeを使ってアップグレードした。
Upgrading to new React Native versions
https://facebook.github.io/react-native/docs/upgrading.html
Androidは問題なく動作したのだが、iOSがエラー頻発。npmのパッケージの問題だったり、いろいろあったが割愛。
どうにか、iOSシミュレーターでアプリが起動するようにはなった。
最後に、Archiveしてipaファイルを生成しようとしたら、"Apple Mach-O Linker (ld) Error Group!"というエラーがでて、Stack Overflowなどで紹介されているあらゆる方法を試したが解決せず。
エラーを詳しく
もうバージョンを下げたままで行くかと絶望しかけたが、なにか基本的なことを見落としている感覚があったので、Xcodeのエラーの見方について調べた。
で、実はXcodeにはErrorの詳細を見る方法があった。
赤丸で示したところを押すと以下の画面に。
ArchiveIntermediates/hohoho/BuildProductsPath/Release-iphoneos/libReact.a(RCTWebSocketModule.o)
/Users/deguchi/Library/Developer/Xcode/DerivedData/hohoho-gbncvuhsltiqyzdxdmgvxwlfsfdm/Build/Intermediates/ArchiveIntermediates/hohoho/BuildProductsPath/Release-iphoneos/libRCTWebSocket.a(RCTWebSocketModule.o)
ld: 279 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因
cocoapodのpod installが通らないので、調べたところ以下の書き方が必要だった。
react_path = '../node_modules/react-native'
yoga_path = File.join(react_path, 'ReactCommon/yoga')
pod 'React', :path => react_path, :subspecs => [
'Core',
'RCTText',
'RCTImage',
'RCTWebSocket', # needed for debugging
'RCTNetwork',
]
pod 'Yoga', :path => yoga_path
よくわからないまま、これを書いてpod installしていたのだが、"Apple Mach-O Linker (ld) Error Group!"の意味は、React以下に、ライブラリが入ったので、Xcodeでライブラリを読み込んでいると、Archiveのときに二重に読み込まれてるというのではねられるということだった。
解決方法
アプリ -> general -> Linked Frameworks and Libraries
赤丸のライブラリを削除して、Archiveしたところ無事に通った!長かった…。
これでArchiveは成功するのだが、アプリが落ちる問題が出た。
結局、以下のようにPodfileを変更したところ、問題が解消した。長すぎた…。
react_path = '../node_modules/react-native'
yoga_path = File.join(react_path, 'ReactCommon/yoga')
pod 'React', :path => react_path
pod 'Yoga', :path => yoga_path
React Nativeは、いろいろ簡単にしてくれるのだが、基礎になってるところを知らないと、こういうところで代償を払うことになるという例でした。