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

Shut the fuck up and write some code

グダグダ言わずにコードを書きたいブログ

openFrameworks 0.8.4 iOS + Xcode6でビルド出来ない

openFrameworks

世間はiPhone6の話題が多いのですが、自分といえば夏ー秋は仕事が多忙過ぎてビッグウェーブには乗り切れず・・最近になりようやく時間が出来てきたので久しぶりにoFを触ってみました。

Xcodeも6が出たので、最新リリース0.8.4を動かしてみようとしたのですが、iOS版はサンプルがエラーが出てビルド出来ない。もしやと思って空のプロジェクトをビルドしてみると、やはりエラーが出てビルド出来ない。またですか・・・そもそも Deployment Targetが3.1とかなってるじゃないですか。意味不明。ターゲットw変更しても下記のようなエラーが。

ld: warning: ignoring file ../../../libs/FreeImage/lib/ios/freeimage.a, missing required architecture i386 in file ../../../libs/FreeImage/lib/ios/freeimage.a (2 slices)
ld: warning: ignoring file ../../../libs/glu/lib/ios/glu-ios.a, missing required architecture i386 in file ../../../libs/glu/lib/ios/glu-ios.a (2 slices)
Undefined symbols for architecture i386:
  "_fwrite$UNIX2003", referenced from:
      _WriteProc(void*, unsigned int, unsigned int, void*) in freeimage.a(FreeImageIO.o-i386)
      LibRaw::dcraw_thumb_writer(char const*) in freeimage.a(libraw_cxx.o-i386)
      _opj_image_create in freeimage.a(image.o-i386)
      _png_default_write_data in freeimage.a(pngwio.o-i386)
      LibRaw::ppm_thumb() in freeimage.a(dcraw_common.o-i386)
      LibRaw::jpeg_thumb_writer(__sFILE*, char*, int) in freeimage.a(dcraw_common.o-i386)
      LibRaw::write_ppm_tiff() in freeimage.a(dcraw_common.o-i386)
      ...
  "_mktime$UNIX2003", referenced from:
      LibRaw::get_timestamp(int) in freeimage.a(dcraw_common.o-i386)
      LibRaw::parse_rollei() in freeimage.a(dcraw_common.o-i386)
      LibRaw::parse_riff() in freeimage.a(dcraw_common.o-i386)
  "_strerror$UNIX2003", referenced from:
      Iex::throwErrnoExc(std::string const&, int) in freeimage.a(IexThrowErrnoExc.o-i386)
  "_strtod$UNIX2003", referenced from:
      _png_handle_sCAL in freeimage.a(pngrutil.o-i386)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

どうしたものかと一瞬思いましたが対応方法はすでにありました。素晴らしい。

Xcode6 Beta + OF 0.8.1 for iOS 8.0 - openFrameworks

Deployment Targetが3.1に指定されているのを任意のバージョンを指定して、main.mmに下記を追記。

extern "C"{
    size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
    {
        return fwrite(a, b, c, d);
    }
    char* strerror$UNIX2003( int errnum )
    {
        return strerror(errnum);
    }
    time_t mktime$UNIX2003(struct tm * a)
    {
        return mktime(a);
    }
    double strtod$UNIX2003(const char * a, char ** b) {
        return strtod(a, b);
    }
}

とりあえず空のプロジェクトでのビルドは通りました。自分のアプリのソースのビルドが通るかはこれから試します。怖い!