0

我正在尝试使用 Qt 但不使用 QMake 编译一个小型应用程序,但是每当我尝试运行它时,都会收到以下错误消息:

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 

并且我能够在 QAbstractItemModel 文件中找到该文件/usr/include/qt4/QtCore/,该目录是我的包含变量的一部分。这是我第一次编写 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. 先决条件之一是../../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 回答