# Debianのメーリングリストでは適当でない内容かもしれないので、
# もし、適当なメーリングリストが分かれば、教えていただきたいのですが。。。
GUIライブラリQtにテスティングフレームワーク qtestlibが
あります。チュートリアルに載っているテストをコンパイル
すると、リンク時に定義されていない参照と出て、コンパイル
できません。
チュートリアルは
http://qt.linux-life.net/4/doc/ja/qtestlib-manual.html#creating-a-test
や
http://qt.linux-life.net/4/doc/ja/qtestlib-tutorial1.html
で、テストのソースファイル teststring.cpp は、
#include <QtTest/QtTest>
class TestQString: public QObject
{
Q_OBJECT
private slots:
void toUpper();
};
void TestQString::toUpper()
{
QString str = "Hello";
QVERIFY(str.toUpper() == "HELLO");
}
QTEST_MAIN(TestQString)
#include "testqstring.moc"
です。2番目の英文のチュートリアルの通り、ソースファイルを置いたディレクトリ内で、
$ qmake -project "QT += testlib"
でプロジェクトファイルを作成し、
$ qmake
でMakefileを作成、makeでコンパイルを行うと、
(省略)
g++ -o tutorial testqstring.o -L/usr/lib -lQtGui -lQtCore -lpthread
testqstring.o: In function `TestQString::toUpper()':
testqstring.cpp:(.text+0x126): undefined reference to `QTest::qVerify(bool, char const*, char const*, char const*, int)'
testqstring.o: In function `main':
testqstring.cpp:(.text+0x2b3): undefined reference to `QTest::qExec(QObject*, int, char**)'
collect2: ld returned 1 exit status
make: *** [tutorial] エラー 1
とリンク時にエラーが出ます。テスティングフレームワークのライブラリ
libQtTest.soは、/usr/lib/libQtTest.soにあり、
$ g++ -o tutorial testqstring.o -L/usr/lib -lQtGui -lQtCore -lpthread -lQtTest
を実行すると、リンクが通ります。あるいは、Makefileで、LIBSに-lQtTestを
追加して、makeを実行すると、コンパイルできます。
で、気になっているのは、qmake -project "QT += testlib" && qmake
の実行でMakefileに、libQtTest.soとリンクさせるという指示が入るはずなのが、
入っていないことです。これって、qmakeコマンドのバグなんでしょうか。
> です。2番目の英文のチュートリアルの通り、ソースファイルを置いたディレクトリ内で、
>
> $ qmake -project "QT += testlib"
>
> でプロジェクトファイルを作成し、
>
> $ qmake
>
> でMakefileを作成、makeでコンパイルを行うと、
ざっと試してみました。うちでは正しく動作しているようです。
$ qmake -project "QT += testlib"
# foo.pro ファイルに QT += testlib と追記されていることを確認。
$ qmake
# Makefile の LIBS に -lQtTest が追加されていることを確認。
$ qmake --version
QMake version 2.01a
Using Qt version 4.4.3 in /usr/lib
どの段階でコケてそうでしょうか?
また、QMake のバージョンはいくつでしょうか?
On Fri, 23 Jan 2009 23:02:44 +0900
Yuya Nishihara <yu...@tcha.org> wrote:
> 西原といいます。こんばんは。
こんばんは。早速の返信ありがとうございます。
>
> > です。2番目の英文のチュートリアルの通り、ソースファイルを置いたディレクトリ内で、
> >
> > $ qmake -project "QT += testlib"
> >
> > でプロジェクトファイルを作成し、
> >
> > $ qmake
> >
> > でMakefileを作成、makeでコンパイルを行うと、
>
> ざっと試してみました。うちでは正しく動作しているようです。
>
> $ qmake -project "QT += testlib"
> # foo.pro ファイルに QT += testlib と追記されていることを確認。
> $ qmake
> # Makefile の LIBS に -lQtTest が追加されていることを確認。
qmakeの実行で、LIBSに -lQtTest は追加されていないです。
>
> $ qmake --version
> QMake version 2.01a
> Using Qt version 4.4.3 in /usr/lib
>
> どの段階でコケてそうでしょうか?
リンク時にコケています。
> また、QMake のバージョンはいくつでしょうか?
Etchを利用しており、qtライブラリのバージョンは
$ dpkg -l libqt4-dev
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)維持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール
|/ エラー=(空欄)無/(H)維持/(R)要再インストール/X=両方(状態,エラーの大文字=異常)
||/ 名前 バージョ 説明
+++-==============-==============-============================================
ii libqt4-dev 4.2.1-2+etch1 Qt 4 development files
です。qmakeのバージョンは
$ qmake -v
QMake version 2.01a
Using Qt version 4.2.1 in /usr/lib
です。qmakeのバージョンは同じで、Qtライブラリのバージョンがわたしのは低いですね。
西原さんのQtライブラリのバージョンが高いということは、lennyをお使いなのでしょう?
> > $ qmake -project "QT += testlib"
> > # foo.pro ファイルに QT += testlib と追記されていることを確認。
> > $ qmake
> > # Makefile の LIBS に -lQtTest が追加されていることを確認。
>
> qmakeの実行で、LIBSに -lQtTest は追加されていないです。
qmake -project "QT += testlib" でプロジェクトファイルに QT += testlib
が追加されるところまではOKですか?
> Etchを利用しており、qtライブラリのバージョンは
>
> $ dpkg -l libqt4-dev
...
> ii libqt4-dev 4.2.1-2+etch1 Qt 4 development files
> $ qmake -v
> QMake version 2.01a
> Using Qt version 4.2.1 in /usr/lib
>
> です。qmakeのバージョンは同じで、Qtライブラリのバージョンがわたしのは低いですね。
> 西原さんのQtライブラリのバージョンが高いということは、lennyをお使いなのでしょう?
sid + experimental (KDE4.1関係) です。
$ dpkg -l libqt4-dev
...
ii libqt4-dev 4.4.3-2 Qt 4 development files
次のファイルに QT += testlib だったら QtTest を追加しそうな記述がありました。
/usr/share/qt4/mkspecs/features/qt.prf
--
else:isEqual(QTLIB, testlib):qlib = QtTest
--
長部さんのところではどうでしょうか?
On Fri, 23 Jan 2009 23:52:47 +0900
Yuya Nishihara <yu...@tcha.org> wrote:
> 西原です。
> qmake -project "QT += testlib" でプロジェクトファイルに QT += testlib
> が追加されるところまではOKですか?
OKです。
> > です。qmakeのバージョンは同じで、Qtライブラリのバージョンがわたしのは低いですね。
> > 西原さんのQtライブラリのバージョンが高いということは、lennyをお使いなのでしょう?
>
> sid + experimental (KDE4.1関係) です。
VMware Server仮想マシンにlennyをインストールして、テストしたところ、qmakeの実行で、
MakefileのLIBSに -lQtTestがちゃんと追加されました。lennyでは問題ないようです。
>
> $ dpkg -l libqt4-dev
> ...
> ii libqt4-dev 4.4.3-2 Qt 4 development files
>
> 次のファイルに QT += testlib だったら QtTest を追加しそうな記述がありました。
> /usr/share/qt4/mkspecs/features/qt.prf
> --
> else:isEqual(QTLIB, testlib):qlib = QtTest
> --
> 長部さんのところではどうでしょうか?
etchでは、/usr/share/qt4/mkspecs/features/qt.prfには、この記述がないですね。
記述を追加して、qmakeを実行しましたが、MakefileのLIBSに -lQtTestは追加されません。
念のため、システムを再起動しても行いましたが、ダメでした。
次に、lennyのQtバージョン 4.2.1に対応するソースアーカイブ qt-x11-opensource-src-4.2.1.tar.gz
をダウンロードして、mkspecs/featuresディレクトリで
$ grep testlib *
を実行したところ、
qt.prf:TMPLIBS = webkit phonon dbus testlib script svg qt3support sql xmlpatterns xml opengl gui network core
qt.prf: else:isEqual(QTLIB, testlib):qlib = QtTest
qt.prf: isEqual(QTLIB, testlib):CONFIG += console
となりました。そこで、etchで、/usr/share/qt4/mkspecs/features/qt.prfファイルで、
上記の内容を反映させたところ、qmakeで、MakefileのLIBSに -lQtTestが追加され、
問題が解決されました。etchではqteslibの実装が不完全なようですね。
以下に、/usr/share/qt4/mkspecs/features/qt.prfへのパッチを載せます。
*** qt.prf.org 2009-01-24 10:47:34.000000000 +0900
--- qt.prf 2009-01-24 11:04:02.000000000 +0900
***************
*** 22,28 ****
win32:INCLUDEPATH += $$QMAKE_INCDIR_QT/ActiveQt
# As order does matter for static libs, we reorder the QT variable here
! TMPLIBS = svg qt3support sql xml opengl gui network core
for(QTLIB, $$list($$TMPLIBS)) {
contains(QT, $$QTLIB): QT_ORDERED += $$QTLIB
}
--- 22,28 ----
win32:INCLUDEPATH += $$QMAKE_INCDIR_QT/ActiveQt
# As order does matter for static libs, we reorder the QT variable here
! TMPLIBS = testlib svg qt3support sql xml opengl gui network core
for(QTLIB, $$list($$TMPLIBS)) {
contains(QT, $$QTLIB): QT_ORDERED += $$QTLIB
}
***************
*** 53,58 ****
--- 53,59 ----
else:isEqual(QTLIB, canvas):qlib = QtCanvas
else:isEqual(QTLIB, qt3support):qlib = Qt3Support
else:isEqual(QTLIB, svg):qlib = QtSvg
+ else:isEqual(QTLIB, testlib):qlib = QtTest
else:message("Unknown QT: $$QTLIB"):qlib =
!isEmpty(qlib) {
target_qt:isEqual(TARGET, qlib) {
***************
*** 65,70 ****
--- 66,72 ----
}
isEqual(QTLIB, opengl):CONFIG += opengl
isEqual(QTLIB, qt3support):DEFINES *= QT3_SUPPORT
+ isEqual(QTLIB, testlib):CONFIG += console
qtAddLibrary($$qlib)
}
> etchでは、/usr/share/qt4/mkspecs/features/qt.prfには、この記述がないですね。
...
> 次に、lennyのQtバージョン 4.2.1に対応するソースアーカイブ qt-x11-opensource-src-4.2.1.tar.gz
...
> qt.prf:TMPLIBS = webkit phonon dbus testlib script svg qt3support sql xmlpatterns xml opengl gui network core
> qt.prf: else:isEqual(QTLIB, testlib):qlib = QtTest
> qt.prf: isEqual(QTLIB, testlib):CONFIG += console
分っかりました。
Qt 4.4 から testlib を指定する方法が新しくなっているみたいです。
Qt < 4.4: CONFIG += qtestlib
http://doc.trolltech.com/4.2/qtestlib-tutorial1.html
Qt >= 4.4: QT += testlib (CONFIG += qtestlib でも可能)
http://doc.trolltech.com/4.4/qtestlib-tutorial1.html
CONFIG += qtestlib に対応するのは次のファイルだと思います。
/usr/share/qt4/mkspecs/features/qtestlib.prf
> 分っかりました。
> Qt 4.4 から testlib を指定する方法が新しくなっているみたいです。
>
> Qt < 4.4: CONFIG += qtestlib
> http://doc.trolltech.com/4.2/qtestlib-tutorial1.html
>
> Qt >= 4.4: QT += testlib (CONFIG += qtestlib でも可能)
> http://doc.trolltech.com/4.4/qtestlib-tutorial1.html
>
> CONFIG += qtestlib に対応するのは次のファイルだと思います。
> /usr/share/qt4/mkspecs/features/qtestlib.prf
確かに、etchのQt 4.2.1で、/usr/share/qt4/mkspecs/features/qtestlib.prf
を修正せずに、
$ qmake -project "CONFIG += qtestlib"
を実行すると、MakefileのLIBSに -lQtTestが追加されます。コンパイルもOKです。
先のメールに記述したパッチを撤回します。
どうもありがとうございました。
On Sat, 24 Jan 2009 12:32:44 +0900
OSABE Satoshi <os...@kub.biglobe.ne.jp> wrote:
> 確かに、etchのQt 4.2.1で、/usr/share/qt4/mkspecs/features/qtestlib.prf
> を修正せずに、
これは、
確かに、etchのQt 4.2.1で、/usr/share/qt4/mkspecs/features/qt.prf
を修正せずに、
の間違いです。つまり、/usr/share/qt4/mkspecs/features/qt.prfをいじる必要は
ないです。