WindowsやMac OS Xのように、
そのため、
そのおかげで、
libQtに起因する謎のエラー
KDE回りを新しいバージョンに追従するために、
具体的には、
$ 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()'
このエラーメッセージは、
今までの経験では、
そこでまずMakefileの内容をチェックしてみましたが、
ざっと眺めたところでは、
$ make VERBOSE=1 /usr/bin/cmake -H/nfs/Srcs/L/Libs/Dbusmenu-qt/libdbusmenu-qt-0.9.2 \ -B/nfs/Srcs/L/Libs/Dbusmenu-qt/build --check-build \ -system CMakeFiles/Makefile.cmake 0 usr/bin/cmake -E cmake_progress_start \ /nfs/Srcs/L/Libs/Dbusmenu-qt/build/CMakeFiles \ /nfs/Srcs/L/Libs/Dbusmenu-qt/build/CMakeFiles/progress.marks \ make -f CMakeFiles/Makefile2 all .... Linking CXX executable dbusmenuexportertest cd /nfs/Srcs/L/Libs/Dbusmenu-qt/build/tests && \ /usr/bin/cmake -E cmake_link_script \ CMakeFiles/dbusmenuexportertest.dir/link.txt --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 CMakeFiles/dbusmenuexportertest.dir/dbusmenuexportertest.cpp.o: \ In function `DBusMenuExporterTest::testGetSomeProperties()': dbusmenuexportertest.cpp:(.text+0x1df7): undefined reference to \ `DBusMenuExporter::DBusMenuExporter(QString const&, QMenu*, \ QDBusConnection const&)' ...
この結果を見ると、
/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
となっているようで、
$ nm -C ../src/libdbusmenu-qt.so.2.6.0 | grep DBusMenuExporter::DBusMenuExporter 0000000000009882 t DBusMenuExporter::DBusMenuExporter\ (QString const&, QMenu*, QDBusConnection const&) 0000000000009882 t DBusMenuExporter::DBusMenuExporter\ (QString const&, QMenu*, QDBusConnection const&)
さて、
おかしいな…、
Qt-4.
$ nm /usr/lib64/libQtCore.so.4.8.1 nm: /usr/lib64/libQtCore.so.4.8.1: no symbols
ライブラリから不要なシンボルを取り除くコマンドをstrip --un-neededからstrip --debugに変更し、
あれこれ思いつく対策は試してみましたが、
QT_VISIBILITY_AVAILABLE is not available
ところが解決は以外なところで見つかりました。
とりあえずビルドできないlibdbusmenu-qtは放置して、
Run Build Command:/usr/bin/make "cmTryCompileExec658130683/fast" /usr/bin/make -f CMakeFiles/cmTryCompileExec658130683.dir/build.make \ CMakeFiles/cmTryCompileExec658130683.dir/build make[1]: ディレクトリ `/nfs/Srcs/K/KDE/4.8.3/Kdelibs/build/CMakeFiles/CMakeTmp' に入ります /usr/bin/cmake -E cmake_progress_report \ /nfs/Srcs/K/KDE/4.8.3/Kdelibs/build/CMakeFiles/CMakeTmp/CMakeFiles 1 .... /usr/bin/g++ -isystem /usr/include -m64 -Wnon-virtual-dtor \ -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall \ -W -Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS... /nfs/Srcs/K/KDE/4.8.3/Kdelibs/build/CMakeTmp/check_qt_visibility.cpp:5:3: \ エラー: #error QT_VISIBILITY_AVAILABLE is not available make[1]: ディレクトリ `/nfs/Srcs/K/KDE/4.8.3/Kdelibs/build/CMakeFiles/CMakeTmp' から出ます make[1]: *** [CMakeFiles/cmTryCompileExec658130683.dir/check_qt_visibility.cpp.o] エラー 1 make: *** [cmTryCompileExec658130683/fast] エラー 2 CMake Error at cmake/modules/FindKDE4Internal.cmake:1295 (message): Qt compiled without support for -fvisibility=hidden. This will break plugins and linking of some applications. Please fix your Qt installation (try passing --reduce-exports to configure). Call Stack (most recent call first): CMakeLists.txt:50 (find_package)
これは今まで見た記憶のないタイプのエラーでした。原因は、
メッセージによると、
メッセージには、
--- qt-kde-qt/configure 2010-09-07 06:05:01.000000000 +0900
+++ build/configure 2011-02-13 22:29:59.000000000 +0900
@@ -730,7 +730,7 @@
CFG_PRECOMPILE=auto
CFG_SEPARATE_DEBUG_INFO=auto
CFG_SEPARATE_DEBUG_INFO_NOCOPY=no
-CFG_REDUCE_EXPORTS=auto
+CFG_REDUCE_EXPORTS=yes
CFG_MMX=auto
CFG_3DNOW=auto
CFG_SSE=auto
なるほどこれだったのか、
GCCの-fvisibilityオプション
さて、
ELF形式のバイナリファイルは、
GCC付属のドキュメント
-fvisibilityオプションを指定しない場合は-fvisibility=defaultと解釈され、
上記ドキュメントによると、
今回ハマったlibdbusmenu-qtの問題も、
それでは、
-fvisibility=hiddenを付けない場合のlibQtCore.
$ nm -C -D NG/usr/lib64/libQtCore.so.4.8.1 | wc -l 6575
と、
一方、
$ nm -C -D OK/usr/lib64/libQtCore.so.4.8.1 | wc -l 4300
となり、
具体的にどのようなシンボルが見えなくなっているのだろう? と思って、
$ nm -C -D NG/usr/lib64/libQtCore.so.4.8.1 | cut -f3- -d' ' | sort > NG_symbols.dat $ nm -C -D OK/usr/lib64/libQtCore.so.4.8.1 | cut -f3- -d' ' | sort > OK_symbols.dat $ diff -u NG_symbols OK_symbols --- NG_symbols.dat 2012-05-26 08:21:41.865942026 +0900 +++ OK_symbols.dat 2012-05-26 08:21:49.148446539 +0900 @@ -224,86 +224,6 @@ w __cxa_finalize w __gmon_start__ w __pthread_unwind_next -BackEase::copy() const -BackEase::value(double) -BackEase::~BackEase() ...
両者の違いをdiffで見ると、
両者の違いを見ていて、
QAbstractAnimation::qt_metacast(char const*) -QAbstractAnimation::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) QAbstractAnimation::resume() ... QAbstractAnimation::staticMetaObject -QAbstractAnimation::staticMetaObjectExtraData QAbstractAnimation::stop() ... QAbstractAnimation::~QAbstractAnimation() -QAbstractAnimationPrivate::setState(QAbstractAnimation::State) -QAbstractAnimationPrivate::~QAbstractAnimationPrivate() -QAbstractAnimationPrivate::~QAbstractAnimationPrivate() -QAbstractAnimationPrivate::~QAbstractAnimationPrivate() QAbstractConcatenable::convertFromAscii(char const*, int, QChar*&) ...
これらの関数がソースコード中でどのように定義されているのかまでは調べていませんが、
上記GCC Wikiに説明されているように、
個人的に、
ディストリビューションのまとめ役を務めるには、