非 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 内にあるため、プリプロセッサによって削除されるべきではありませんか?