[[diary/Kojima]]
・Qt-4.8.1と-fvisibility
Qt-4.8.1が出ていたので,4.7.1から更新しようとチェック.ざっと見,
4.7.1で当てていたfake-bold用のパッチはそのままでは当たらなくなっているようなので,
とりあえずBLFSのQt-4.8.1にあったGCC-4.7用のパッチとglib-2.32用のパッチ,
インストール先をlib64にするパッチをあてて,BLFSの指定していたビルドオプションを流用してビルド.
ビルドそのものは問題なく終ったものの,このQt-4.8.1をインストールした環境では
うまくコンパイルが通らなくなる.
最初に気付いたのはlibdbusmenu-qt-0.9.2で,ビルドしようとすると
$ make
...
[ 51%] Built target dbusmenu-qt
Linking CXX executable dbusmenuexportertest
CMakeFiles/dbusmenuexportertest.dir/dbusmenuexportertest.cpp.o:
In function `DBusMenuExporterTest::testGetSomeProperties()':
dbusmenuexportertest.cpp:(.text+0x1df7): undefined reference to
`DBusMenuExporter::DBusMenuExporter(QString const&, QMenu*,
QDBusConnection const&)'
dbusmenuexportertest.cpp:(.text+0x275b): undefined reference to
`DBusMenuExporter::~DBusMenuExporter()'
dbusmenuexportertest.cpp:(.text+0x27df): undefined reference to
`DBusMenuExporter::~DBusMenuExporter()'
...
と,DBusMenuExporterTest クラスの関数が参照できない,というエラーになる.
通常,この手のエラーは,Makefileでリンクするライブラリやバイナリファイルの設定が
間違っていることが多いので,さて,どういうコマンドでリンクされているのか,,と
Makefileを調べてみると,cmake で生成されたMakefileなのでよく分からない.
何とか見つけたVERBOSE=1というオプションを指定して実行してみると,
/usr/bin/g++ -isystem /usr/include -m64
CMakeFiles/dbusmenuexportertest.dir/dbusmenuexportertest.cpp.o
CMakeFiles/dbusmenuexportertest.dir/testutils.cpp.o
-o dbusmenuexportertest -rdynamic -lQtGui -lQtCore -lQtDBus -lQtTest
../src/libdbusmenu-qt.so.2.6.0 -lQtGui -lQtCore -lQtDBus
-Wl,-rpath,/nfs/Srcs/L/Libs/Dbusmenu-qt/build/src
こんなコマンドラインでリンクしていることが分かった.一方,参照できない
DBusMenuExporterTestクラスはどこで定義されているのか,と調べてみると,
このパッケージ自身が生成したライブラリである ../src/libdbusmenu-qt.so.2.6.0 だった
(リンクエラーが生じているのはtest/以下のテスト用プログラム)
Cの場合は,このコマンドラインを元に-lでライブラリを追加したり,-Lでライブラリのディレクトリを追加したり,
ライブラリをリンクする順番を変えてみたりしてやれば何とかなることが多いので,
あれこれ試してみたけど効果なし.
Google等で調べてみても特に該当する情報は無いし,
Qt-4.7.1の環境でビルドしようとすると問題なくこの部分も通ってしまう.
システム側のQtライブラリをリンクしないようにすると
DBusMenuExporterTestクラス以前にQtの提供するクラスが見つからない,とのエラーになる.
Qt-4.8.1側の問題であることは確かそうなんだけど,
さて,4.7.1と4.8.1で何が変わったんだろう..と首をひねっていたのであった(続く)
#comment