読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

Cocos2d-xでCocoaPodsを使う

Cocos2d-x iOS

CocoaPodsのバージョンをあげたら色々とハマってしまったのでメモです。

ここに書いたのはcocos newした直後からになるので、実装途中とかだと違う問題が発生する可能性があります。

環境

  • Cocos2d-x 3.2
  • CocoaPods 0.34.2
  • Xcode 6.0.1

Podfile

proj.ios_macの直下にPodfileを作成する

$ cd proj.ios_mac
$ pod init

サンプル。とりあえずiOSのほうだけにAFNetworkingを導入。

platform :ios, '7.0'

source 'https://github.com/CocoaPods/Specs.git'

target 'Sample iOS' do
  pod "AFNetworking"
end

target 'Sample Mac' do

end

pod install

インストールしてみる

$ pod install
Analyzing dependencies
Downloading dependencies
Installing AFNetworking (2.4.1)
Generating Pods project
Integrating client project

[!] The `Sample iOS [Debug]` target overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined in `Pods/Target Support Files/Pods-Sample iOS/Pods-Sample iOS.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The `Sample iOS [Release]` target overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined in `Pods/Target Support Files/Pods-Sample iOS/Pods-Sample iOS.release.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

なんか色々と警告メッセージが出ます。

が、とりあえず先に進みます。

ビルド

pod installで作成された.xcworkspaceを開いてビルドします。

Lexical or Preprocessor Issue 'cocos2d.h' file not found というエラーになってcocos2dが参照できてないみたいです。

エラー対応

基本的な考えは下記と同じで、HEADER_SEARCH_PATHS$(inherited)が無いのが原因です。

上記のままだとCocoaPodsのバージョンが変わって作成されるディレクトリ構成とかも変わったようで、少し変更が必要です。

Podfile修正、pod install

Podfileに書きを追記します。

pod_targetの変数をPodプロジェクトのTargetに合わせてください。基本は対象アプリTargetの頭にPods-が付与される感じになると思います。

pod_target = "Pods-Sample\ iOS"

post_install do |installer|
  # HEADER_SEARCH_PATHS に $(inherited) を追加する
  installer.project.build_configurations.each do |configuration|
    workDir = Dir.pwd
    xcconfigFilename = "#{workDir}/Pods/Target\ Support\ Files/#{pod_target}/#{pod_target}.#{configuration.name}.xcconfig"
    xcconfig = File.read(xcconfigFilename)
    newXcconfig = xcconfig.gsub(/HEADER_SEARCH_PATHS = "/, "HEADER_SEARCH_PATHS = $(inherited) \"")
    File.open(xcconfigFilename, "w") { |file| file << newXcconfig }
  end
end

この例だと、proj.ios_mac/Pods/Target Support Files/Pods-Sample iOSディレクトリ内にdebugとreleaseの.xcconfigファイルがあります。

2つの.xcconfigファイルのHEADER_SEARCH_PATHS$(inherited)を追加しています。

修正したらpod installをもう一度行います。警告がでますがとりあえず放置です。

再ビルド

ビルドすると今度は次のようなエラーになります。

Undefined symbols for architecture x86_64:
  "_GCControllerDidConnectNotification", referenced from:
      -[GCControllerConnectionEventHandler observerConnection:disconnection:] in libcocos2dx iOS.a(CCController-iOS.o)
  "_GCControllerDidDisconnectNotification", referenced from:
      -[GCControllerConnectionEventHandler observerConnection:disconnection:] in libcocos2dx iOS.a(CCController-iOS.o)
  "_MPMoviePlayerPlaybackDidFinishNotification", referenced from:
      -[UIVideoViewWrapperIos dealloc] in libcocos2dx iOS.a(UIVideoPlayerIOS.o)
      -[UIVideoViewWrapperIos setURL::] in libcocos2dx iOS.a(UIVideoPlayerIOS.o)
  "_MPMoviePlayerPlaybackStateDidChangeNotification", referenced from:
      -[UIVideoViewWrapperIos dealloc] in libcocos2dx iOS.a(UIVideoPlayerIOS.o)
      -[UIVideoViewWrapperIos setURL::] in libcocos2dx iOS.a(UIVideoPlayerIOS.o)
  "_OBJC_CLASS_$_GCController", referenced from:
      objc-class-ref in libcocos2dx iOS.a(CCController-iOS.o)
     (maybe you meant: _OBJC_CLASS_$_GCControllerConnectionEventHandler)
  "_OBJC_CLASS_$_MPMoviePlayerController", referenced from:
      objc-class-ref in libcocos2dx iOS.a(UIVideoPlayerIOS.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

framework追加

下記の2つのframeworkが足りないのでBuild Phasesから追加します。

  • MediaPlayer.framework
  • GameController.framework

再々ビルド

今度はビルドに成功すると思います。

これでOKなはずです。

もしダメな場合はOther Linker Flags$(inherited)を追加すれば…(確実とは言えませんが

pod installの警告をなんとかする

pod installの警告が気持ち悪いのでなんとかします。

XcodeのTarget設定のBuild SettingsPreprocessor Macros$(inherited)を追加します。おそらくdebugとreleaseで分かれてると思いますのでそれぞれ$(inherited)を追加してください。

再びpod installすると警告が消えてるはずです。

まとめ

とりあえず色々ややこしいです。