我使用qmake && make
以下project.pro
文件编译Qt可执行文件:
INCLUDEPATH *= ../../dependencies/boost
QT *= opengl xml
CONFIG *= qt opengl static
TARGET = myexe
HEADERS = Viewer.hpp MainWindow.hpp Inspector.hpp
SOURCES = main.cpp Viewer.cpp MainWindow.cpp Inspector.cpp
Run Code Online (Sandbox Code Playgroud)
但是,在编译时,moc
会对无法解析的boost宏进行扼流.要解决这个bug,我需要将标志传递-DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED
给moc,但我无法设法这样做.
如何编辑我的.pro
文件以传递给定的标志moc
?(但不是g++
,QMAKE_CXXFLAGS
如此)
我知道这个问题已被问过很多次,但我在这里找不到解决方案,也没有在谷歌找到解决方案.
这是我的头文件
#ifndef MAINCONTROLLER_H
#define MAINCONTROLLER_H
#include <QSettings>
#include <QDebug>
#include <QDir>
#include <QObject>
#include "PhTools/PhString.h"
#include "PhStrip/PhStripDoc.h"
class MainController : public QObject
{
Q_OBJECT
public:
explicit MainController(QObject *parent = 0);
void loadSettings();
PhString getLastFile();
void setLastFile(PhString fileName);
bool openDoc(PhString fileName);
signals:
void docChanged();
private:
QSettings * _settings;
PhStripDoc * _doc;
};
#endif // MAINCONTROLLER_H
Run Code Online (Sandbox Code Playgroud)
我的CPP档案:
#include "MainController.h"
MainController::MainController(QObject *parent) :
QObject(parent)
{
_doc = new PhStripDoc();
loadSettings();
}
void MainController::loadSettings()
{
_settings = new QSettings(QDir::homePath() + "/Library/Preferences/com.me.me.plist", QSettings::NativeFormat);
getLastFile(); …
Run Code Online (Sandbox Code Playgroud) 我有一个小班不能正常工作,我不知道它有什么问题.编译器给出了以下消息:
main.cpp: error: undefined reference to 'CDetails::CDetails()'
Run Code Online (Sandbox Code Playgroud)
这是代码中的快照:
//main.cpp
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QQmlContext>
#include <QDebug>
class CDetails : public QObject
{ Q_OBJECT
public:
CDetails() {}
~CDetails(void) {}
public slots:
void cppSlot(const QString &msg)
{ qDebug() << "Called the C++ slot with message:" << msg;
}
};
int main(int argc, char *argv[])
{ QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/testqml/main.qml"));
viewer.showExpanded();
CDetails *test = new CDetails();
QObject::connect((QObject*)viewer.rootObject(),
SIGNAL(qmlSignal(QString)),test,
SLOT(cppSlot(QString)));
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
在main.qml中:
import QtQuick 2.0
Rectangle {
id: guide …
Run Code Online (Sandbox Code Playgroud) 早上好!
我知道这里已经有了这个问题:Qt在msbuild下并行多个文件,但我不会出现这个老问题.
我在Visual Studio 2010下工作,我必须加快我的应用程序的编译时间.我使用所有标志,如/MP
MSBuild -j
和Make等...优化的最后一步是并行化MOC的步骤.他们的速度非常缓慢,我搜索了很多,但我没有找到解决方案.
我知道它jom
存在,但它使用nmake,我必须使用MSBuild.
如果有人已经听过解决方案,那应该真的很酷!
祝你今天愉快!
我有一个名为FindAndReplaceBar的类,其实现如下:
#include "FindAndReplaceBar.h"
#include <QLabel>
#include <QPushButton>
#include <QGridLayout>
#include <QTextDocument>
#include <QLineEdit>
FindAndReplaceBar::FindAndReplaceBar(QObject *parent) :
QToolBar(NULL)
{
lblFind = new QLabel("Find: ",this);
lblReplace = new QLabel("Replace",this);
ledtFind = new QLineEdit(this);
ledtReplace = new QLineEdit(this);
QPixmap next(":/res/resources/next.gif");
QPixmap previous(":/res/resources/previous.gif");
QPixmap close(":/res/resources/close_icon.gif");
btnFindNext = new QPushButton(QIcon(next),"",this);
btnFindPrevious = new QPushButton(QIcon(previous),"",this);
btnClose = new QPushButton(QIcon(close),"",this);
btnReplace = new QPushButton("Replace",this);
btnReplaceAll = new QPushButton("Replace All",this);
btnFindNext->setFlat(true);
btnFindPrevious->setFlat(true);
btnClose->setFlat(true);
btnReplace->setFlat(true);
btnReplaceAll->setFlat(true);
lytFindAndReplaceBar = new QGridLayout(this);
lytFindAndReplaceBar->addWidget(lblFind,0,0,1,1);
lytFindAndReplaceBar->addWidget(ledtFind,0,1,1,2);
lytFindAndReplaceBar->addWidget(btnFindPrevious,0,3,1,1);
lytFindAndReplaceBar->addWidget(btnFindNext,0,4,1,1);
lytFindAndReplaceBar->addWidget(lblReplace,0,5,1,1);
lytFindAndReplaceBar->addWidget(ledtReplace,0,6,1,2);
lytFindAndReplaceBar->addWidget(btnReplace,0,8,1,1);
lytFindAndReplaceBar->addWidget(btnReplaceAll,0,9,1,1);
this->setLayout(lytFindAndReplaceBar); …
Run Code Online (Sandbox Code Playgroud) 我想知道Kahn Process Network和Actor Model之间的实际区别是什么.实际上,如果我查看定义,它们都是模型,其中计算实体(在两种情况下称为Actors ......)通过无界缓冲区交换消息.此外,在这两种情况下,这些消息都是异步发送的,因为过程总是可以发送消息.它不需要等待收件人准备好接收.
因此,我的问题是,有任何实际的区别吗?
非常感谢 !
我的配置是:
ubuntu 21.04
gcc 11
qt 5.15.2
Run Code Online (Sandbox Code Playgroud)
和这样的错误消息:
AutoMoc subprocess error
------------------------
The moc process failed to compile
"SRC:/src/Layers/ViewLayer/Process/NearFieldProcessUtil.h"
into
"SRC:/build/MTESS_autogen/MLM4FWGUYC/moc_NearFieldProcessUtil.cpp"
Command
-------
/usr/lib/qt5/bin/moc -DJSON_DIAGNOSTICS=0 -DJSON_USE_IMPLICIT_CONVERSIONS=1 "-DvtkRenderingCore_AUTOINIT_INCLUDE=\"/home/alex/workspace/mtess/MTESS/build/CMakeFiles/vtkModuleAutoInit_be7301261a49b13d6a9b1d9e110eacd8.h\"" -I/home/alex/workspace/mtess/MTESS/src -I/home/alex/workspace/mtess/MTESS/vendor/ProjectStructure -I/home/alex/workspace/mtess/MTESS/vendor/imgui -I/home/alex/workspace/mtess/MTESS/vendor/imgui/imgui -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/local/qwt-6.2.0/include -I/usr/local/include/opencascade -I/lib -I/usr/local/include -I/usr/include/vtk-9.0 -I/usr/include/c++/10 -I/usr/include -I/usr/include/c++/11 -I/usr/include/x86_64-linux-gnu/c++/11 -I/usr/include/c++/11/backward -I/usr/lib/llvm-14/lib/clang/14.0.0/include -I/usr/include/x86_64-linux-gnu --include /home/alex/workspace/mtess/MTESS/build/MTESS_autogen/moc_predefs.h --output-dep-file -o /home/alex/workspace/mtess/MTESS/build/MTESS_autogen/MLM4FWGUYC/moc_NearFieldProcessUtil.cpp /home/alex/workspace/mtess/MTESS/src/Layers/ViewLayer/Process/NearFieldProcessUtil.h
Output
------
usr/include/c++/10/bits/fs_fwd.:39: Parse error at "std"
Run Code Online (Sandbox Code Playgroud)
相同的代码库在 Windows 中使用qmake成功编译,我正在将编译方法转换为cmake,这不应该是代码问题,而是 cmake 配置或工具链兼容性问题。我的问题是:
如何让cmake使用特定编译器的唯一包含的?
正如你所看到的,似乎 3 个包含的 gcc-10、gcc-11、clang-14 都被使用了。我尝试卸载 gcc-10,但 clang-14 依赖于它,并且我使用了 update- alternatives指定 gcc、g++、clang 和 …
我试着像这样编写一个简单的Qt应用程序:
main.cpp:
#include <QApplication>
class MyApp : public QApplication {
Q_OBJECT
public:
MyApp(int argc, char* argv[]);
};
MyApp::MyApp(int argc, char* argv[]) :
QApplication(argc,argv) {
}
int main(int argc, char* argv[]) {
MyApp app(argc,argv);
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译并将其与Qt Creator 2.3.1(Qt 4.7.4)链接时,我得到3个"未解析的外部符号"错误:
main.obj:-1:错误:LNK2001:未解析的外部符号
""public:virtual struct QMetaObject const*__thiscall MyApp :: metaObject(void)const"
(?metaObject @ MyApp @@ UBEPBUQMetaObject @@ XZ)".
main.obj:-1:错误:LNK2001:未解析的外部符号
""public:virtual void*__thiscall MyApp :: qt_metacast(char const*)"
(?qt_metacast @ MyApp @@ UAEPAXPBD @ Z)".
main.obj:-1:错误:LNK2001:未解析的外部符号
""public:virtual int __thiscall MyApp :: qt_metacall(enum QMetaObject :: Call,int,void**)" …
在Qt中,它们都是有效的,并且行为相同:
emit someSignal(value);
Run Code Online (Sandbox Code Playgroud)
VS
emit(someSignal(value));
Run Code Online (Sandbox Code Playgroud)
有什么区别吗?
我有一个使用 CMake 构建的 QT 项目。其中一个目标有 142 个文件需要moc
. 当我使用qt5_wrap_cpp
源文件并构建它时,该过程在大约 15 秒内完成:
set(CMAKE_AUTOMOC NO)
qt5_wrap_cpp(moc_files ${source_files})
list(APPEND source_files ${moc_files})
target_sources("${target}" PRIVATE "${source_files}")
Run Code Online (Sandbox Code Playgroud)
这里的每个任务都是为每个文件调用moc
工具。
然而,当我使用AUTOMOC
特征时,生成时间增加到 6 分钟:
set(CMAKE_AUTOMOC YES)
target_sources("${target}" PRIVATE "${source_files}")
Run Code Online (Sandbox Code Playgroud)
这里的cmake
任务大致如下:
cmake.exe -E cmake_autogen <my_project_path>/<my_project>_autogen.dir Debug
Run Code Online (Sandbox Code Playgroud)
我再次运行该命令,在没有任何内容可生成的情况下,运行需要 0.3 秒。然而,当我删除一个 moc 文件时,该命令需要 2 秒才能运行。当需要生成5时是:
TotalSeconds : 11.3493687
超过11秒。当我删除所有 142 个 moc 文件时,执行时间为cmake_autogen
:
TotalSeconds : 354.5894649
我没有在文档和 CMake 问题中找到任何与此相关的内容。我可以做些什么来AUTOMOC
像单个文件处理一样高效地运行吗?
CMake版本3.10.2
Qt版本5.9.3
更新1。
在分析 CMake 之后,我注意到调用moc
是最耗时的操作。命令行似乎有 247 个包含路径,而 …