5

VS2005 用に QT 4.6 と QWT 5.2.0 をコンパイルしました。

QwtDial からクラスを派生させようとしていますが、派生クラスにはスロットがあります。そのため、Q_OBJECT マクロを追加する必要があります。ただし、これを行うと、リンカーはこのエラーを抑制します。

エラー LNK2001: 未解決の外部シンボル "public: static struct QMetaObject const QwtDial::staticMetaObject" (?staticMetaObject@QwtDial@@2UQMetaObject@@B)

私は Qwt.dll を依存関係で調べましたが、その機能があります。.lib ファイルを 16 進エディタで見ると、名前がマングルされた文字列と完全に一致することがわかります。

パスに Qwt lib があります。実際、lib の名前を変更すると、lib ファイルが見つからないというエラーが発生します。したがって、正しいライブラリを見ていることがわかります。

Q_OBJECT をスキップすると、非 Q_OBJECT Qwt 派生クラスを含むいくつかの QWT ウィジェットを使用して、すべてが正しくリンクおよび描画されます。

この本当に迷惑なリンカの問題を引き起こす原因を誰か知っていますか?

アップデート:

Q_OBJECT を追加したクラスが、確実にそのクラス用に生成された MOC ファイルを取得していることを確認しました。リンカー エラーは、実際にはこの生成された MOC ファイルから発生しています。

moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static
    struct QMetaObject const QwtDial::staticMetaObject" 
    (?staticMetaObject@QwtDial@@2UQMetaObject@@B)

そのため、非常に奇妙で非定型的なもののように見えます。シンボルは間違いなくライブラリにあります。

4

5 に答える 5

11

私は同じ問題を抱えています。Qt4.4 と VC2003 を使用して古いプロジェクトを更新しており、QwtDial の代わりに QwtPlot を使用しています。エラーは次のとおりです。

LNK2001: 未解決の外部シンボル "public: static struct QMetaObject const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@B)

それだけ。他には何もありません。デバッグとリリースの取り違えの問題や、Qt Designer プラグインの削除に関係している可能性がある問題を指摘しているフォーラムの参照を見つけました。

これは私にとってはうまくいっているようです: "DEFINES += QWT_DLL" という行を project.pro ファイルの先頭に追加してください。

qmake project.pro

nmake リリース

于 2010-01-19T06:15:14.963 に答える
1

この答えについてはよくわかりませんが、ここにいくつかの情報があります:

あなたの派生クラスには、一致する moc_ ファイルがないように思えます! moc ファイルは通常、Q_OBJECT マクロを使用するときに使用されます... プロジェクトの moc 情報は、Makefile、Makefile.debug、および Makefile.release ファイルに保存されます。どの .cpp ファイルが moc ファイルを必要とし、どの .cpp ファイルが必要でないかを示すのは、このファイルです。

moc に関するドキュメントは QtAssistant にあります: http://qt.nokia.com/doc/4.6/moc.html

これを確認するには、「生成された」フォルダに移動し、「moc_yourDerivedClass.cpp」という名前のファイルを探す必要があります。

一致するファイルが見つからない場合は、yourderivedClass を使用して qmake プロセスを再度実行する必要があります...おそらく最初に qmake を使用したとき、Q_OBJECT マクロはまだクラスに含まれていなかったため、moc ファイルは作成されていません。 ...

少しでもお役に立てば幸いです!

于 2010-01-08T06:09:48.670 に答える
1

The problem is with moc file.You should use Q_DECL_EXPORT (or some thing else like it) in QwtPlot definition which tell compiler this class is usable by other library but the parts of class generated in moc file dosn't contains these so when you linking these library with other program it dosn't know how to link those parts. Anyway I don't have any idea how to tell these to Qt!

于 2010-04-21T11:37:23.693 に答える
1

ここでは、qwt 5.2.1、qt 4.6、および VS2008 とまったく同じ問題が発生します。同じコードが Linux で完全にコンパイルされます。すべての moc ファイルは適切に生成および処理されています。リリースとデバッグが混在するライブラリはありません。時間があるときに qwt bugs に報告します。

定義のリストに QWT_DLL を追加すると (プロジェクト プロパティ -> c++ -> プリプロセッサ -> 定義)、問題が解決されます。

于 2010-07-05T09:44:31.863 に答える
0

プロジェクト ディレクトリで qmake を再度実行してみてください。

$ qmake -プロジェクト

$ qmake -tp vc

これが私の問題を解決したものです。多くの人から寄せられた「moc ファイルに問題があるようです」という説明を読むと、何をすべきかわかりません。

私はこれで私自身の問題を引き起こしたと思います。プロジェクト全体をビルドする前に、プロジェクトの .ui ファイルを右クリックしてコンパイルしました。どういうわけか、必要なすべてのファイルが完全には生成されませんでした。とにかく、qmake を実行すると、以前にはなかった問題が突然発生した場合に便利です。

ただし、プロジェクトの設定で気づいたことがもう 1 つあります。プリプロセッサ ディレクティブが設定されていませんでした。qmake を再度実行すると、これが修正されました。

于 2011-04-17T04:03:40.343 に答える