プロメモグラム

誰が見てもわかるような文章を目指す

【Mac】qtbindingsをインストール中のエラー Undefined symbols for architecture x86_64:

クロスプラットフォームであり、複数の言語でGUIアプリケーションを開発したいと思い検索をしてみたところ、Qtというフレームワークを使用するとそれが実現できそうであるとわかった

そんなQtをrubyを使ってコーディングを行うためにgemを使って気軽にインストールする

まずはQt自体のインストール(Homebrew使ってます)
これでqt4とcmakeがインストールされる

brew  install automoc4

次にRubyで使用するためにqtbindingsを導入

gem install qtbindings

しかしエラー

[ 83%] Building CXX object ruby/qtruby/src/CMakeFiles/qtruby4shared.dir/marshall_types.o
Linking CXX shared library libqtruby4shared.dylib
Undefined symbols for architecture x86_64:
  "_rb_float_new", referenced from:
      unsigned long primitive_to_ruby<float>(float) in handlers.o
      unsigned long primitive_to_ruby<double>(double) in handlers.o
      marshall_QListqreal(Marshall*) in handlers.o
      marshall_QVectorqreal(Marshall*) in handlers.o
      marshall_QPairqrealQColor(Marshall*) in handlers.o
      marshall_doubleR(Marshall*) in handlers.o
  "_rb_funcallv", referenced from:
      method_missing(int, unsigned long*, unsigned long) in Qt.o
      class_method_missing(int, unsigned long*, unsigned long) in Qt.o
      QtRuby::VirtualMethodCall::callMethod() in marshall_types.o
      funcall2_protect(unsigned long) in marshall_types.o
      QtRuby::InvokeSlot::invokeSlot() in marshall_types.o
  "_rb_gc_writebarrier_unprotect", referenced from:
      rb_obj_wb_unprotect(unsigned long, char const*, int) in marshall_types.o
  "_rb_str_cat_cstr", referenced from:
      _rb_str_catf in Qt.o
      marshall_QString(Marshall*) in handlers.o
      marshall_QByteArray(Marshall*) in handlers.o
  "_rb_str_new_static", referenced from:
      method_missing(int, unsigned long*, unsigned long) in Qt.o
      class_method_missing(int, unsigned long*, unsigned long) in Qt.o
      _prettyPrintMethod in Qt.o
  "_rb_sym2id", referenced from:
      method_missing(int, unsigned long*, unsigned long) in Qt.o
      class_method_missing(int, unsigned long*, unsigned long) in Qt.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

調べてみるとRubyをインストールする際に –enable-shared オプションが必要であるそうだ
rubyのライブラリをダイナミックリンクとして出力してくれるらしく、Qtではそのライブラリを使用しているのだろうか
自分はrbenvを使用しているのでrbenvでRubyをインストールし直すとこうなる(バージョンは2.2.0)

CONFIGURE_OPTS="--enable-shared" rbenv install 2.2.0

もう一度gemコマンドを実行すると無事にqtrubyをインストールできた