2

非 Qt バージョンの Qt/C++ プログラム (-DDISABLE_MYMODULE) をコンパイルすると、次のコンパイラ エラーが発生します。

src/mymodule.moc.cpp:12:2: error: #error "The header file
'mymodule.hpp' doesn't include <QObject>."
src/mymodule.moc.cpp:19:1: error: ‘QT_BEGIN_MOC_NAMESPACE’ does not name a type
src/mymodule.moc.cpp:40:6: error: ‘MyModule’ has not been declared
...

GNU make を使用しています (qmake ではありません)。私の Makefile は、モジュールごとに 2 つのオブジェクト ファイルをコンパイルします。1 つは .cpp ソース ファイルから直接、もう 1 つは .moc.cpp ソース ファイルからの MOC オブジェクト ファイル (これは機能しません) で、両方とも g++ を使用します。この .moc.cpp ソース ファイルは、.hpp ヘッダーから MOC によって作成されます (このプロセスはエラーをスローしません)。

問題のヘッダー ファイルは次のようになります。

#ifndef DISABLE_MYMODULE //My problem macro
#ifndef MYMODULE_HPP
#define MYMODULE_HPP
//...
class MyModule : //...
{
    Q_OBJECT //Qt problem macro
    //...
};
//...
#endif
#endif

問題のマクロを設定しなければ、すべてがうまくコンパイルされます(後でリンクして実行されます)。設定しても、QTの問題マクロをコメントアウトすると、問題なくコンパイルされます(Qt以外のバージョンをビルドします)。

Q_OBJECT をどの MOC に置き換えるかは正確にはわかりませんが、まだ DISABLE_MYMODULE 内にあるため、プリプロセッサによって削除されるべきではありませんか?

4

2 に答える 2

3

マクロ DISABLE_MYMODULE では、Q_OBJECT を含むクラス定義を除外しているようです。一方、このコードは引き続き moc ツールによって処理され、mymodule.moc.cpp ファイルが生成されます。これにより、mymodule.hpp ヘッダー ファイルがインクルードされます。mymodule.moc.cpp がコンパイラによって処理されると、.hpp ファイルが含まれますが、プリプロセッサは DISABLE_MYMODULE のためにそのコンテンツを除外するため、コンパイラはクラスの定義、#include <QObject> および Q_OBJECT マクロを展開する必要があるものを見つけられません。 . そのため、コンパイラは、予想されるものを見つけられず、動揺します...

DISABLE_MYMODULE が定義されている場合はビルドから mymodule.moc.cpp を除外するか、DISABLE_MYMODULE が定義されている場合は (より良い) mymodule.hpp で moc 処理を無効にすることで解決できると思います。

于 2012-04-29T18:15:09.823 に答える
-1

次の基準を確認してみてください。

  1. クラスは QObject から直接または間接的に継承する必要があり、QObject は継承リストの最初にある必要があります。
  2. クラスは、別個の *.h および *.cpp ファイルで定義および実装されます。そうでない場合は、クラスが実装および定義されているファイルの末尾に #include "you_cpp_file.moc" を追加する必要があります。
于 2013-11-17T23:26:46.313 に答える