Qtのサブクラスを作ったらundefined symbol が出るときは
Cannot load library /.../lib***.so: (/.../lib***.so: undefined symbol: _ZTVN5***10***E)
undefined symbol が出るときでありがちなのがサブクラス側に実装もれがある場合で、ソースコードをにらんでうんうん悩んだりしたけど、そもそも何がないといわれているのかがわからなければ話にならない。
そこでまずやるべきは nm である。そして、nm --demangle である。
そこで分かるのは、足りないのは vtable であるということ。
つまりメソッドの実装漏れじゃあない。
Qt のサブクラスに vtable が足りないというのはどういうことか。
Qtをはじめよう! にはっきり書いてある。
http://labs.qt.nokia.co.jp/2010/07/07/subclassing-qobject.html
moc を使っていないということだ。
そこでどうするか、は以下に全部書いてあった。
http://d.hatena.ne.jp/opamp_sando/20110423
必要な箇所だけ抜き出すと、
# Qt4のパッケージを使う find_package(Qt4 4.8.1 REQUIRED) # QtサブクラスのヘッダをQT4用にラップする set(qt_headers ***.h) qt4_wrap_cpp(moc_headers ${qt_headers}) # Qt 関係の設定 add_definitions(${QT_DEFINITIONS}) include(${QT_USE_FILE}) # ターゲットの設定 add_executable(${target} ${sources} ${moc_headers} ) target_link_libraries(${target} ${QT_LIBRARIES})
これによりメタオブジェクトコード moc_***.cxx が生成され、undefined symbolが解決される。
あと一つつけ加えると、connect で実行したいメソッドは単なる private メソッドで宣言してはだめで、
private Q_SLOTS:
として宣言する。
以上、Qt初心者の反省でした。