仅在从命令行构建 Qt 项目时出错

Posted

技术标签:

【中文标题】仅在从命令行构建 Qt 项目时出错【英文标题】:Error only when building Qt project from command line 【发布时间】:2015-05-16 13:40:56 【问题描述】:

我有一个大问题。我创建了一个虚拟项目来隔离我的错误。 因为是一个有 6 个文件的项目,在这里添加所有代码是不可行的,所以我创建了一个 github project 并在此处描述想法的同时添加了所有代码。你可以看看那里的代码。

ma​​in.cpp的源代码:

#include <QApplication>
#include <QObject>

#include "mainwindow.h"
#include "testclass.h"

int main(int argc, char *argv[])

    QApplication a(argc, argv);

    MainWindow w;
    TestClass c;

    QObject::connect(&w, &MainWindow::mySignal,
                     &c, &TestClass::mySlot);

    w.show();

    return a.exec();

MainWindow 类有一个 Q_SIGNAL,当我按下 from 上的按钮时会发出它,mySlot 只是 TestClass(继承 QObject)中的 Q_SLOT(继承 QObject),其中 qDebugs 是一条消息.

如果我从QtCreator 构建它,我的项目构建良好,但是当我从命令行构建它时,我得到一个奇怪的错误。

我从命令行做什么:

$ qmake QMAKE_TEST.pro
$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
In file included from main.cpp:4:0:
mainwindow.h: In function ‘int main(int, char**)’:
mainwindow.h:19:7: error: ‘void MainWindow::mySignal()’ is protected
  void mySignal();
       ^
main.cpp:14:36: error: within this context
  QObject::connect(&w, &MainWindow::mySignal,
                                    ^
main.cpp:15:41: error: no matching function for call to ‘QObject::connect(MainWindow*, void (MainWindow::*)(), TestClass*, void (TestClass::*)())’
                   &c, &TestClass::mySlot);
                                         ^
main.cpp:15:41: note: candidates are:
In file included from /usr/include/qt4/QtCore/qcoreapplication.h:45:0,
                 from /usr/include/qt4/QtGui/qapplication.h:45,
                 from /usr/include/qt4/QtGui/QApplication:1,
                 from main.cpp:1:
/usr/include/qt4/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
     static bool connect(const QObject *sender, const char *signal,
                 ^
/usr/include/qt4/QtCore/qobject.h:204:17: note:   no known conversion for argument 2 from ‘void (MainWindow::*)()’ to ‘const char*’
/usr/include/qt4/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
     static bool connect(const QObject *sender, const QMetaMethod &signal,
                 ^
/usr/include/qt4/QtCore/qobject.h:217:17: note:   no known conversion for argument 2 from ‘void (MainWindow::*)()’ to ‘const QMetaMethod&’
/usr/include/qt4/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
 inline bool QObject::connect(const QObject *asender, const char *asignal,
             ^
/usr/include/qt4/QtCore/qobject.h:337:13: note:   no known conversion for argument 2 from ‘void (MainWindow::*)()’ to ‘const char*’
make: *** [main.o] Error 1
$
$

首先为什么说mySignal si protected 因为AFAIK 所有Q_SIGNALS 都是公开的?其次,如果我从 Qt Creator 运行它并且从命令行运行它时出现错误,为什么它可以完美运行?

有人可以帮帮我吗?

【问题讨论】:

我看到的一件事是您使用的 Qt4 不支持这种类型的 connect() 如果我从 QtCreator 构建它,我的项目构建得很好,但是当我从命令行构建它时,我得到一个奇怪的错误。 可能你正在使用Qt5 与 QtCreator? 【参考方案1】:

发现问题...我正在使用qmake 版本4 构建一个Qt5.5 项目...

【讨论】:

嗯。我想我应该在评论之前推送刷新。出于某种原因,我没有这个答案.. @drescherjm 非常感谢 :)

以上是关于仅在从命令行构建 Qt 项目时出错的主要内容,如果未能解决你的问题,请参考以下文章

从命令行仅在解决方案中构建一个项目

命令行创建Maven项目卡住以及出错解决办法。

怎么在Qt creator中加入命令行参数进行编译程序

使用 MSBuild 命令行实用程序时出错

在命令行工具中获取资源路径

从 DOS 命令行运行 JUnit 测试时出错