はじめに
Google Sign-In SDK 便利ですよね。
アドレスや名前など色々ユーザのデータ取得できます。
絵的には 〇〇でログイン・会員登録 とか
アプリや Web サイトのログイン・会員登録の画面で
Twitter とか Facebook とかと一緒に並んでいるやつです。
こういうの↓
今回この SDK を使う機会があり,
SDK をドラッグ&ドロップで導入した際に,
既存の SDK との兼ね合いで下記のエラーが出て
ビルドできなかったのをなんとか解決したので備忘録。
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Google Sign-In の実装がどういうものかは,
本家のチュートリアルにあるので今回は説明は省かせていただきます。
新規でサンプルつくるとすんなり導入できるんだけどなぁ。
CocoaPods で導入だとまた少し違うと思います。
【参考】
https://developers.google.com/identity/sign-in/ios/
ビルドエラーについて
今回のプロジェクトでは CocoaPods を使っておらず,
他の SDK は何個か導入していたという感じでした。
【環境】
- Xcode 8.2.1
- Enable Bitcode NO
- CocoaPods は未使用
- その他ライブラリは複数使用
- Other Linker flags は空欄
下記のドラッグ&ドロップ用のチュートリアルを参考に
Google Sign-In SDK 関係の 5 個のファイルを
プロジェクトにドラッグ&ドロップで導入して(下記),
コードも実装してビルドしたところ下記エラーが出てビルドエラー・・・
Facebook 系の SDK ? がぶつかってそうだ。
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_FBAccessTokenData", referenced from:
objc-class-ref in NCMB(NCMBFacebookUtils.o)
"_OBJC_CLASS_$_FBRequest", referenced from:
objc-class-ref in NCMB(NCMBFacebookUtils.o)
"_OBJC_CLASS_$_FBSettings", referenced from:
objc-class-ref in NCMB(NCMBFacebookUtils.o)
"_OBJC_CLASS_$_FBSession", referenced from:
objc-class-ref in NCMB(NCMBFacebookUtils.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
前述のチュートリアルの途中であった Other Linker Flags の設定を
確認し,$(OTHER_LDFLAGS) -ObjC
を空欄にしてみると
このエラーは消えるが,またもやビルドエラー・・・
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_GGLContext", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_CLASS_$_GIDSignInButton", referenced from:
objc-class-ref in ViewController.o
"_OBJC_CLASS_$_GIDSignIn", referenced from:
objc-class-ref in ViewController.o
objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
今度は見た感じ今回導入したいものが問題になってるのがわかる。
まとめると Other Linker Flags の設定に
-ObjC
を入れると既存の SDK が問題で,
-ObjC
を外すと Google Sign-In SDK が問題・・・
解決策
今まで(幸運にも) Other Linker Flags 系のエラーで苦しんだことがなかったので結構時間かかってしまった。
もともと設定が空欄だったので,ここに今回の SDK(framework) のパスを指定することで対応した。動作上問題ないですが,正しいかわからないのでもっといい解決策をお持ちの方はコメントいただければと思います。
チュートリアルでは $(OTHER_LDFLAGS) -ObjC
を
指定するように書いてあった部分,Other Linker Flags のところに
直接 framework を読み込ませるようにした。
ディレクトリ部分は適宜追加した階層を指定する。
-force_load $(PROJECT_DIR)/GoogleAppUtilities.framework/GoogleAppUtilities
-force_load $(PROJECT_DIR)/GoogleSignIn.framework/GoogleSignIn
-force_load $(PROJECT_DIR)/GoogleSignInDependencies.framework/GoogleSignInDependencies
-force_load $(PROJECT_DIR)/GoogleSymbolUtilities.framework/GoogleSymbolUtilities
これで双方のビルドエラーが発生せずに Google Sign-In の導入がうまくいった。
おわりに
Other Linker flags の設定をいじらずに今まで来たのは
ある意味平和だったのかもしれない。
この際だから Other Linker flags についてもう少し調べてみようと思う。
乱文になりましたが,ご覧いただきありがとうございました。
小手先での修正に過ぎないと思っているので正しい方法,もっといい方法ありましたらご教示お願いいたします。m(_ _)m
参考
Using Parse and Google Maps in the same app - conflict at linker flags -- iOS 7.1, Xcode 5.1