c++ - 通过终端创建项目文件并编译失败,但通过 Qt Creator IDE 工作正常

标签 c++ qt makefile qt5 qmake

我是新手,请耐心等待。 我使用的是 Ubuntu,并且已经从 .run 文件安装了 Qt 5.1.0。 QtCreator 2.8 也已安装。 我将这些行添加到我的 .bashrc 文件中:

export QTDIR=/opt/Qt5.1.0/5.1.0/gcc
export QMAKESPEC=$QTDIR/mkspecs/linux-g++
export QT_PLUGIN_PATH=$QTDIR/plugins

export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

我尝试编译简单的示例应用程序:

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
 QApplication app(argc,argv);
 QLabel *label = new QLabel("Hello Qt!");
 label->show();
 return app.exec();
}

我执行了“qmake -project”和“qmake hello.pro”,然后输入“make”。 这给了我错误:“hello.cpp:1:24: fatal error :QApplication:没有这样的文件或目录 编译终止。”

问题似乎出在 qmake 中。当我用 QtCreator 制作项目时,它的 Makefile 有不同的 INCPATH 变量,这个阶段没有问题(还有其他问题,但这是另一个问题)。 这是通过 QtCreator 创建的 Makefile 中的 INCPATH 变量:

“INCPATH = -I/opt/Qt5.1.0/5.1.0/gcc/mkspecs/linux-g++ -I../helloQtCreator -I/opt/Qt5.1.0/5.1.0/gcc/include -I/opt/Qt5.1.0/5.1.0/gcc/include/QtWidgets -I/opt/Qt5.1.0/5.1.0/gcc/include/QtGui -I/opt/Qt5.1.0/5.1.0/gcc/include/QtCore -I. -I. -I.”

这个是由 qmake 通过终端创建的:

“INCPATH = -I/opt/Qt5.1.0/5.1.0/gcc/mkspecs/linux-g++ -I. -I. -I/opt/Qt5.1.0/5.1.0/gcc/include -I/opt/Qt5.1.0/5.1.0/gcc/include/QtGui -I/opt/Qt5.1.0/5.1.0/gcc/include/QtCore -I.”

项目名称不同,但为什么 qmake 不包含 “-I/opt/Qt5.1.0/5.1.0/gcc/include/QtWidgets” 何时从终端手动启动? 将此行添加到 .pro 文件暂时解决了问题:

QT += widgets

但我不想每次都手动执行此操作。 我该如何解决它?

谢谢。

最佳答案

这是 Qt 中的错误,当使用命令 qmake -project 从终端创建项目文件时,生成的项目文件不包含行:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets。这可能就是 qmake 在 MAKEFILE 中不包含“-I/opt/Qt5.1.0/5.1.0/gcc/include/QtWidgets”的原因。更多信息QT BUG .

关于c++ - 通过终端创建项目文件并编译失败,但通过 Qt Creator IDE 工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18419929/

相关文章:

c - 如何让 Makefile 将 obj 文件放在单独的目录中?

c++ - 根据指定的时间间隔将浮点值映射到函数

linux - Makefile 不是重建依赖项吗?

c - 链接时间 "undefined reference to "错误

c++ - 按空格拆分文本

visual-studio - CMake 到 Qt Creator .pro 文件;从 Qt Creator 构建特定的 CMake 项目

c++ - Qt - 如何在多个平台上保存一个配置文件

c++ - 用 C++ 计算雅可比矩阵(符号数学)

c++ - 如何实现 back_insert_iterator 的结束哨兵?

c++ - 如何将 std::string 转换为 boost::chrono::nanoseconds