Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Qtのテスティングフレームワークqtestlibについて

89 views
Skip to first unread message

OSABE Satoshi

unread,
Jan 23, 2009, 7:56:08 AM1/23/09
to
長部と申します。

# 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コマンドのバグなんでしょうか。

Yuya Nishihara

unread,
Jan 23, 2009, 9:02:44 AM1/23/09
to
西原といいます。こんばんは。

> です。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 のバージョンはいくつでしょうか?

OSABE Satoshi

unread,
Jan 23, 2009, 9:19:34 AM1/23/09
to
長部です。

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をお使いなのでしょう?


Yuya Nishihara

unread,
Jan 23, 2009, 9:52:47 AM1/23/09
to
西原です。

> > $ 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
--
長部さんのところではどうでしょうか?

OSABE Satoshi

unread,
Jan 23, 2009, 9:21:39 PM1/23/09
to
長部です。
返信ありがとうございます。

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)
}

Yuya Nishihara

unread,
Jan 23, 2009, 10:06:09 PM1/23/09
to
西原です。こんにちは。

> 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


OSABE Satoshi

unread,
Jan 23, 2009, 10:32:44 PM1/23/09
to
長部す。
こんにちは。

> 分っかりました。
> 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です。
先のメールに記述したパッチを撤回します。
どうもありがとうございました。


OSABE Satoshi

unread,
Jan 23, 2009, 11:51:59 PM1/23/09
to
長部です。
ちょっと書き間違えたので訂正です。

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をいじる必要は
ないです。

0 new messages