Kinectで店員を呼ぶ装置:openFrameworksのビルドエラーと対応方法まとめ

客員研究員のテライです。
今回のレストラン展示での私の制作物はopenFrameworksというC++ベースの開発環境を使います。openFrameworksはインスタレーションの開発に向いていて、商業施設展示やライブステージでも使用されているのを見かけます。

本格的にopenFrameworksを使うのは初めてですが、私は元々Flashデベロッパだったこともありそれほどとっつきにくいとは感じませんでした。しかしopenFrameworkを触りだした当初は、

  • ビルドエラーの時に表示されるエラー内容の意味がよく分からない
  • ネット上からサンプルをダウンロードした時手を加えていないにも関わらずビルドエラーになってしまうことも多い

という感触がありとてもお洒落で面白い開発環境ですが最初でつまづいて諦めてしまうこともあるかもしれません。

本エントリでは、私がopenFrameworksで見かけたエラーとその対応をリストアップしておきますので同じエラーが出て困っている方の一助になれば幸いです。

※MacOS10.9, Xcode5環境での話となります

目次(★マークは個人的に特に大事だと思います)

  • サンプルの置き場所に注意
  • ★) Product > Cleanする
  • ★) Base SDKをMacOS 10.8にする
  • 黄色い警告は無視する?
  • Release Buildを指定する
  • 複数のプロジェクトを開いている場合
  • 必要なアドオンがそろっているか確認する
  • ★) 関連するアドオンがそろっているか?
  • ★) アドオンのファイル内にlibsディレクトリがある場合
  • Xcode上に読み込んだアドオン内にサンプルが含まれている場合
  • libstdc++に切り替える
  • Header Search Paths を見直す

このイベントに関する記事をすべてみる

サンプルの置き場所に注意

openFrameworksでは、

  • (openFrameworksディレクトリ)/apps/myApps/(プロジェクト)
  • (openFrameworksディレクトリ)/examples/(3d,event,gl,gui…)/(サンプルプロジェクト)

の場所にプロジェクトファイルを置くように決められています。理由は、プロジェクトやサンプルプロジェクト内のプロジェクトファイル(xcodeの場合、拡張子.xcodeproj)を開いてbuild setting設定を見れば分かるのですが、プロジェクトからのライブラリパス指定が、

../../../libs/openFrameworks/**

等のように、プロジェクトファイルから3階層上を指定しているためです。
このルールを守っていればきちんとビルドできますので、例えば

  • (openFrameworksディレクトリ)/apps/myOneNewProject/(プロジェクト)

という場所に作ることは可能です。

terai_kinect_0310image1
'ofMain.h' file not found

のように、openFrameworksには必ず存在しているofMain.hファイルすら見つからない(not found)だと警告されている時は、この階層構造が保てていない可能性があるので、プロジェクトファイルの置き場を確認してみましょう。

Product > Cleanする

さっきまでビルド成功していたのに次にエラーが出た、でもそれほど原因が思い当たらないという時は、まずはプロジェクトをクリーンアップをしてみると良いでしょう。

terai_kinect_0310image2

クリーン作業自体は簡単なのですが、ついついこれを忘れがちで、さんざんコードを見直しても分からなかったけども結局はクリーンアップするだけど治ったというケースもあります。

Base SDKをMacOS 10.8にする

最近openFrameworksを始めた人にはこれが厄介だと思います。

'tr1/memory' file not found

という意味がよく分からない以下のようなエラー

terai_kinect_0310image3

MacOS10.9, Xcode5以上の環境の時にこのエラー警告文が出る場合は、Xcodeウィンドウ左側のファイルリスト最上段のプロジェクトをクリック、中央ウィンドウのBuild Settingタブをクリックして表示される設定の中の Base SDK の項目を「Latest OS X(OS X 10.9)」から「MacOS 10.8」に下げることでエラーが消えることがあります。

terai_kinect_0310image4

ネットからダウンロードしてきたサンプルで tr1/memory エラーが出た場合、そのサンプルが MacOS10.9,Xcode5 のリリース以前に公開されたサンプルである場合、この原因を疑ってみるといいと思います。

黄色い警告は無視する?

terai_kinect_0310image5

ファイルリスト部分にずらりと黄色い警告アイコンが表示されると心臓に悪いですが、赤い警告アイコンとは違い、黄色い警告アイコンだけであればビルドはできるので気にしないでおきましょう。警告内容の多くは使用しているアドオン内の実装で使われているAPIが「Deprecations(非推奨)」ですよ、つまり古いので新しいAPIに置き換えるといいですよと諭してくれているわけです。

凄腕エンジニアが作ってくれたアドオンの内部を書き換えるのもいいですが、まぁひとまず動くのであれば初心者のうちはそのまま構わずにおいてもいいと思います。

Release Buildを指定する

ビルド成功(Build Succeeded)したはずなのに、アプリケーションが表示されないぞという時はここを指定しているか疑いましょう。

terai_kinect_0310image6

ちなみにDebugビルドはその名の通りデバッグ用でブレイクポイントが使えたりします。Releaseビルドはそういった細かいデバッグ作業はできませんが、こちらが本番用であり、Releaseビルドの方が再生パフォーマンスが高い(=本来の再生挙動)状態でアプリ再生できます。Buildだと動かないけどReleaseだと動くという場合もありますのでまずはReleaseビルドで動くかを確かめましょう。

複数のプロジェクトを開いている場合

terai_kinect_0310image7

ファイルリストの上段に

Workspace Integrity
Couldn't load openFrameworksLib.xcodeproj because it is already opened from another project or workspace

という赤い警告が表示される時は、別の.xcodeprojファイルを開いている可能性があります。そちらを閉じればその警告も消えます。ここは赤い警告アイコンですが、それでもビルドはできるかと思いますので、私の場合複数プロジェクトを開いておきたい場合等はこの警告は無視しています。

以上は基礎レベルですのでそれほど難しくはないでしょう。個人的にはアドオンと呼ばれる openFrameworks における機能拡張・ライブラリ的機能を使いだす頃から対処に迷う場合がありました。ネットからサンプルをダウンロードしてきたのに

xxx.h file not found

というビルドエラーが出てしまう場合もこのケースが当てはまることが多いです。

必要なアドオンがそろっているか確認する

terai_kinect_0310image8

基礎知識としてアドオンは

  • (openFrameworksディレクトリ)/addons

ディレクトリに入れることになっています。この場所には最初からいくつかのアドオンが入っています。

また、ネットからダウンロードしてきたアドオン(追加アドオン)はフォルダ名が「(アドオン名)-master」のように記述されている場合が多いですが、この場合は-masterの文字を消した状態でaddonsディレクトリに置くようにしましょう。多くの場合、追加するアドオンの中にはexamplesディレクトリとしてサンプルプロジェクト一式が同梱されており、このサンプルプロジェクトを所定の位置(※前述のappsやexamplesディレクトリの2階層下)に置くことでテストできます。

さて、プロジェクトを開いて画面左側のファイルリスト上のaddonsの内容が赤い場合は、そのファイルがないということです。

terai_kinect_0310image9

これは

  • Finder上のaddonsディレクトリの中にそういうアドオンがそもそも存在していない
  • Finder上のaddons内のディレクトリ名が異なっているため見つけられていない ← xxx-masterのままとか

を確認しましょう。そしてアドオン関連ファイルが存在する(リスト上で黒文字になる)ようにすることが先決です。

また、必要なアドオンがプロジェクトのファイルリスト上に読み込まれていない場合は

terai_kinect_0310image10

ファイルリストのaddons上で右クリックし「add files to “(プロジェクト名)”」で所定のアドオンを読み込みます。

terai_kinect_0310image11

関連するアドオンがそろっているか?

例えばofxMSAFluidという、パーティクル流体のアドオンを使いたい場合は、その他にも関連するアドオンが必要になります。アドオンページ上には依存関係(Dependencies)としてMSACoreが必要だと書いてありますので、そちらのアドオンもダウンロードしてプロジェクト上で動くようにしておく必要があります。

※実際にMSAFruidを動かすには、他にもofxSimpleGuiTooやofxTuioやofxMSAInteractiveObject等が必要だったのですが、何が足りないかはビルド時に警告されますので、都度ネット上を探しにいってダウンロードして組み込んでいきましょう。

Tips:OFPluginというXcode5用のプラグインをインストールすれば、不足しているアドオンを自動で収集&設定してくれます。アドオンの構造についてある程度理解が深まったら、リンク先の動画を見ることでその便利さを知ることができると思います。

アドオンのファイル内にlibsディレクトリがある場合

使いたいアドオンの中にsrcの他にlibsディレクトリがある場合、このlibsの中のクラスが見つからないというビルドラーになることがあります。

terai_kinect_0310image12

ファイルリスト上で赤い(存在していない)場合は、アドオンを再読み込みするのもいいかもしれません。一旦対象のアドオンを全部消して(Xcodeファイルリスト上で右クリック>Delete、参照=ReferenceだけをDeleteし、実際のファイル自体は消さないこと)、前述の通り再度addons上で右クリックして「add files to “(プロジェクト名)”」してきちんとファイル名が黒くなるか試してください。

そうではなく、ファイルリスト上ではlibsの中も黒文字(存在している)のに.h file not foundと参照エラーが出る場合があります。これは、addons直下のsrcは読み込めているのにlibsディレクトリ以下のヘッダーファイルの読み込みに失敗している場合が多く、Build SettingのHeader Search Pathsに、libs以下のディレクトリを指定することで、文字通りそのディレクトリのヘッダーにパスが通るようにできます。

terai_kinect_0310image13

※注意点として、libsディレクトリの中にさらにディレクトリ構造がある場合は、そのディレクトリもヘッダーパスとして指定してあげる必要があるようです。ofxOpenCVやofxOscアドオン等がこれに該当します。

terai_kinect_0310image14

Tips:動くプロジェクトの設定と比較して相違点を探す

projectGenerator_osxにある「projectGenerator」を使って、必要なアドオンを組み込んだ状態の新規プロジェクトを作成することができます。

terai_kinect_0310image15

ジェネレータ画面上のaddonをクリックすると上の画面になります。左側が標準で入っているアドオン、右側が自分が追加したアドオンです。自分がこれから作るプロジェクトに必要なアドオンをチェックしてGENERATE PROJECTすれば、ここまで書いたようなアドオンへの参照設定がきちんとできた状態の新規プロジェクトを作成できます。

最初からジェネレーターで作ったプロジェクトをベースにして開発していけば良いのですが、私の場合、あるアドオン(機能)を使ったサンプルファイルを修正していって自分のプロジェクトを作っていき、都度必要なアドオンを追加していく場合が多いので、途中追加のアドオンのヘッダーパス設定について迷った時は、自分のプロジェクトとジェネレーターで生成したプロジェクトのビルド設定(Build Setting)を見比べるようにしています。

Xcode上に読み込んだアドオン内にサンプルが含まれている場合

プロジェクト作成後に手動でaddonを追加した際、

ld: 6 duplicate symbols for architecture i386

みたいなエラーに遭遇しました。

terai_kinect_0310image16

上の画像のように、アドオンを読み込んだ時にサンプルファイル等も一緒に読み込まれることがあります。不必要なファイルをDelete(参照だけ切る)ことで、ビルド成功したこともありましたのでご留意ください。
こちらの記事にもあるように、同じアドオンを重複して読み込んでいる場合も同様のエラーが出ることがあるそうです。

他にも、レアケースかもしれませんが、以下のようなエラーにも遭遇しました。

libstdc++に切り替える

‘tr1/memory’ file not foundエラーが出たのでBaseSDKをMacOS 10.8に変更したにも関わらずエラーが消えなかった際、こちらの記事にあるように Build Settings の C++ Standard Library の箇所を libstdc++ に切り替えることでエラー回避できたことがありました。

terai_kinect_0310image17

Header Search Paths を見直す

ビルドできていたのに後日ビルドエラーになって焦ったのですが、私のMacやXcodeの不具合なのか分かりませんが、Build Settings のヘッダーパス指定の文字列が勝手に差し替えられてしまいビルドエラーとなるケースがありました。

terai_kinect_0310image18

最初は../../../addons/~ を指定してビルドできていたのに、後日プロジェクトを開けるたびに、上の画像のように変なバックスラッシュが勝手に追加されていたり、必要ないのに$(SRCROOT)パスを追加していたりしました。一旦全部消して指定し直しました、、。

最後に

一応こういった箇所に注意することで、ネット上のサンプルはほぼちゃんと動かせる状態にはなりました。まだopenFrameworksを初めて間もないので、記事内に間違いや、その他注意点等ありましたら、私のtwitterアカウント(@trick7)宛にお知らせいただけますと幸いです。

“未来レストラン”に参加されるには事前登録が必要です。登録はこちらから行ってください。また定員に限りがあるので登録される方は急いでくださいね!

“未来レストラン”の来場登録をする

“未来レストラン”案内ページへ
mirai-reataurant 未来レストラン