0

QMake を使用せずに Qt を使用して小さなアプリケーションをコンパイルしようとしていますが、実行しようとすると、次のエラー メッセージが表示されます。

g++ -c -g -pg -Wall -Wextra -pipe   -c -o ../../MOCFiles/moc_projectModel.o ../../MOCFiles/moc_projectModel.cpp
In file included from ../../MOCFiles/moc_projectModel.cpp:10:0:
../../MOCFiles/../Src/ProjectStructure/projectModel.h:4:30: fatal error: QAbstractItemModel: No such file or directory
compilation terminated.
make: *** [../../MOCFiles/moc_projectModel.o] Error 1

$(INCLUDE)これは、変数を適切に構築していないことを示唆しているように見えますが、次のようになります。

INCLUDE   = -I/usr/include/qt4 \
            -I/usr/include/qt4/QtGui \
            -I/usr/include/qt4/QtCore \
            -I/usr/include/qt4/QtXml \
            -I/usr/share/qt4/mkspecs/linux-g++ \
            -I../../Src/ProjectStructure 

/usr/include/qt4/QtCore/また、インクルード変数の一部であるディレクトリでQAbstractItemModel ファイルを見つけることができます。GNU Makefile を書くのはこれが初めてで、何が間違っているのかわかりません。参考までに、ファイル全体を以下に示します。

CXX       = g++
CXXFLAGS  = -c -g -pg -Wall -Wextra -pipe
LINK      = g++

LIBS      = -L/usr/lib \
            -L/usr/lib/i386-linux-gnu \
            -lgtest \
            -lQtGui \
            -lQtCore \
            -lQtXml \
            -lpthread

INCLUDE   = -I/usr/include/qt4 \
            -I/usr/include/qt4/QtGui \
            -I/usr/include/qt4/QtCore \
            -I/usr/include/qt4/QtXml \
            -I/usr/share/qt4/mkspecs/linux-g++ \
            -I../../Src/ProjectStructure

OBJECTS = ../Objects/main.o \
          ../Objects/test_projectEntity.o \
          ../Objects/moc_test_projectModel.o \
          ../../Objects/projectEntity.o \
          ../../Objects/projectModel.o \
          ../../MOCFiles/moc_projectModel.o

../../Binaries/tests: $(OBJECTS)
  $(LINK) $^ $(LIBS) -o $@

../Objects/main.o : ../Src/main.cpp
  $(CXX) $(CXXFLAGS) $(INCLUDE) ../Src/main.cpp -o ../Objects/main.o

../Objects/moc_test_projectModel.o : ../MOCFiles/moc_test_projectModel.cpp
  $(CXX) $(CXXFLAGS) $(INCLUDE) ../MOCFiles/moc_test_projectModel.cpp -o ../Objects/moc_test_projectModel.o

../../MOCFiles/moc_test_projectModel.cpp :  ../Src/test_projectModel.cpp
  moc ../Src/test_projectModel.cpp -o ../MOCFiles/moc_test_projectModel.cpp

../Objects/test_projectEntity.o : ../Src/test_projectEntity.cpp
  $(CXX) $(CXXFLAGS) $(INCLUDE) ../Src/test_projectEntity.cpp -o ../Objects/test_projectEntity.o

clean:
  rm -f ../Objects/main.o ../Objects/test_projectEntity.o ../Objects/test_projectModel.o
4

1 に答える 1

2

ビルドしようとしているように見えます../../Binaries/tests。前提条件の1つはですが../../MOCFiles/moc_projectModel.o、それを構築するための明示的なルールがないため、Makeは暗黙的なルールを使用してこれを試みます。

g++ -c -g -pg -Wall -Wextra -pipe   -c -o ../../MOCFiles/moc_projectModel.o ../../MOCFiles/moc_projectModel.cpp

そこには言及がないことに注意してくださいINCLUDE。したがって、g++はを調べることを知りません /usr/include/qt4/QtCore/。簡単な解決策は、ルールを追加することです。

../../MOCFiles/moc_projectModel.o : ../../MOCFiles/moc_projectModel.cpp
    $(CXX) $(CXXFLAGS) $(INCLUDE) $< -o $@

冗長性と混乱を減らすために、自動変数 $<を使用したことに注意してください。$@それをパターンルールにすることもできます。

../../MOCFiles/%.o : ../../MOCFiles/%.cpp
    $(CXX) $(CXXFLAGS) $(INCLUDE) $< -o $@

これによりmoc_projectModel.o、同じパターンを持つ他のすべて(のソースとオブジェクトの両方MOCFiles/)が処理されます。他の改善を行うこともできますが、それで十分に稼働させることができます。

于 2012-04-26T21:03:21.137 に答える