LoginSignup
1
2

More than 5 years have passed since last update.

Google Sign-In SDK for iOS 導入時に出た linker command failed with exit code 1 に対応する

Last updated at Posted at 2017-02-28

はじめに

Google Sign-In SDK 便利ですよね。
アドレスや名前など色々ユーザのデータ取得できます。
絵的には 〇〇でログイン・会員登録 とか
アプリや Web サイトのログイン・会員登録の画面で
Twitter とか Facebook とかと一緒に並んでいるやつです。
こういうの↓

GoogleSign-InButton.png

今回この 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 Tutorial

Google Sign-In SDK 関係の 5 個のファイルを
プロジェクトにドラッグ&ドロップで導入して(下記),

GoogleSign-InSDK.png

コードも実装してビルドしたところ下記エラーが出てビルドエラー・・・
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 を空欄にしてみると
このエラーは消えるが,またもやビルドエラー・・・

OtherLinkerFlags_Missing.png

ビルドエラー内容2
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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2