dnjiro’s 9VAe blog

誰でもアニメが作れる無料ソフト9VAeきゅうべえ開発者のブログ

9VAeきゅうべえiPad版 iPhoneで動かない原因、ライブラリのnew/deleteエラー解決

9VAe iPad版を作成中。次の問題で悩んでいた。

 

  • iPadでは動くプロジェクトを、iPhoneをターゲットにすると動かない
  • 9VAeをライブラリにすると、C++の new, delete[] がリンクエラーになる

 

1。ロシアのプログラマーデバッグしてもらった

最初の問題の答えは、iPadで動くが iPhoneでは動かない関数があるという単純な理由で、その関数は、リンクエラーを出さないのでビルド時にはわからない(deprecateワーニングは出ていたみたいだが、あまりにも多いので見てない・・・)。ところが起動時にエラーがでて起動しないみたい。

 

本当に単純な原因だったが、そういうことがあるということを知らないと、気づかない。Cofee and Code に、プロジェクトを持って行って、Xcodeをよく知っているというロシアの人に見てもらったら、画面をちょいちょいと触って、すぐ見つけてくれた。素人プログラムがつまずく問題は、最初のうちは知っている人が見るとすぐわかる単純なことが多い。ありがとう!!こうやってすぐ助けてもらえるのは最初のうちだけで、だんだん原因が複雑になって来て、ある時点で、こんなタコなプログラムは何をやっているかさっぱりわからんとサジを投げられることになります。

 

Cofee and Codeは、日本に来ている外国人の人が情報交換のために集まっているグループで、何回か参加したが、来ている人のレベルが高いのでびっくりする。教えてくれたロシアの人は、一人でUnityでゲームアプリを何本も作って販売していて、その収益で生活できてるらしかった。会社に勤めると自由に旅行ができなくなるから、フリーでいて、あちこちの国を回っているらしい。すごいなあ。

 

ゲーム会社でプログラムを作っていた人もすごかった。ゲームの中での動きをプログラムしていた人で、Unityのプラグインを作ったりする。ロープの動きを作るとか、格闘戦をやっている時のキャラクタの動きを、外からプログラムで制御するとか、まあ、9VAeきゅうべえでちまちま動作を作っているのとは次元が違う。まあそうだろうな。たくさん動画をリアルタイムで生成しないといけないし、必要な3次元情報を全部持っているわけだし。こんな世界がある中で、2次元のアニメなんかやってていいのか、とも思うが、一方、小学校なんかに行くと、一枚一枚絵を描いて、タブレットで写真をとったりして、アニメの作り方は、こうですと言っているからなあ。頑張らなあかん。

 

2。C++の new delete を、Objective-Cのライブラリに入れる方法

これは自分で検索し、工夫して解決。ちょっとレベルアップして来た感じ。

iphone - Creating an Objective-C++ Static Library in Xcode - Stack Overflow

 

どういう問題かというと、世の中には、Cが基本にあって、そこから、C++Objective-C に別れた。さらに、C++からC#ができて、Objective-Cから Swiftに移っているらしい。C++の方がよく使われているが、スティーブジョブスが、Appleを追い出されて作った、Nextが、Objective-Cで作られていた関係で、今の Macも、Objective-Cが中心に入っている。

 

ところが、世の中には、C++で作られたプログラムの方が多い。これが使えないと困るので、Objective-Cから、C++のプログラムが使えるようになっている。それで、C++で追加された新機能が、newとdeleteである。これはどういう機能かというと、関数の中で、 newと書くと、新しいメモリを確保してくれて、開放する時が deleteだ。これは同じ関数をいろんな人が呼ぶ時に重要になってくる。つまり、この仕組みがないと、別の人から読み出された時に、内部変数が同じ値になったりする。 Cではそれが嫌なら、スタックを使うのだが、大きなメモリを入れるとすぐスタックがなくなるという問題があった。

 

この、newとdeleteが、9VAeの中の png作成用のライブラリで使われてるわけです。

作っているのが、objective-Cのライブラリなので、newとdeleteの概念がなく、new deleteをサポートする実行関数、つまりメモリ管理をしてくれる関数が、ライブラリにくっつかないみたいですね。メモリ管理は本体のメモリ管理と協調して動かないといけないので、ライブラリに入れないというのは理解できますね。

 

で、結果として、9VAeライブラリを本体にくっつけると、newとdeleteが未定義というエラーが出てしまっていたわけです。

 

これの解決は、上の記事にありました。

中身が空の、xxxx.mm という名前のファイルを本体プログラムに入れる

拡張子、.mmは、Objective-C++ というもので、これが、Objective-C に、C++の機能を追加したものなんでしょう。これがプロジェクトに入っていると、newとdeleteを入れなあかんということになって、リンクエラーが解消されました。

中身は空で、ファイル名もなんでもいいみたいだ。

 

ということで、だいぶ、きゅうべえiPad版の形ができて来た。

 

最初の問題はなんとか解決して、iPhoneでも 9VAeが動くようにしたい。

iPadで動くけど、iPhoneでは動かない関数は、メニューバーのプルダウン表示で、試していないけど、アプリの名前を iTunesと変更すれば、動くようになるという裏情報もあった。

つまり、iPhoneでは動かないようにしようとしたけど、どうしても、iTunesが移植できなくて、内部でこっそり動かすようにしたんだろうな。名前を iTunesにするとアプリストアの審査に通らないから使えないとも書いてあった。