使用CMAKE的QT MOC错误 [英] QT MOC error using CMAKE
问题描述
我正在尝试编写一个OpenCV应用程序,使用QT创建GUI并使用CMAKE生成makefile。我有的问题是,当我尝试执行make命令,我得到的错误:
#error这个文件是使用moc从5.2.1。它不能与这个版本的Qt的包含文件(该moc已经改变太多了。)
...所以我想我应该尝试使用moc从qt4而不是qt5这个(我有qt4和qt5安装)。确切的,我有/ usr / bin / moc-qt4以及/ usr / bin / moc,所以我想我所需要做的是 invoke sudo update-alternatives --config moc 但我得到的是 update-alternatives:error:no alternatives for moc 。嗯...
所以我认为问题是与版本的qt或在我的CMakeLists.txt,所以这里是我使用的代码:
cmake_minimum_required(VERSION 2.8.9)
/ pre>
project(Vigil)
include_directories (
build
src
inc
uis
)
################ #########配置OpenCV包含内容########################
FIND_PATH(CV_INCLUDE_DIR cv。 h
/ usr / include / opencv
)
MESSAGE(状态OpenCV:CV路径:$ {CV_INCLUDE_DIR})
FIND_PATH(CVAUX_INCLUDE_DIR cvaux.h
/ usr / include / opencv
/ usr / local / include / opencv
/ usr / local / include / opencv / cvaux / include
/ usr / include / opencv / include
)
MESSAGE(状态OpenCV:CVAux路径:$ {CXCORE_INCLUDE_DIR})
FIND_PATH(CXCORE_INCLUDE_DIR cxcore.h
/ usr / include / opencv
/ usr / local / include / opencv
/ usr / local / include / opencv / cxcore / include
)
MESSAGE状态OpenCV:CXCore路径:$ {CVAUX_INCLUDE_DIR})
FIND_PATH(HIGHGUI_INCLUDE_DIR highgui.h
/ usr / include / opencv
/ usr / local / include / opencv /其他的lib / highgui
/ opt / local / include / opencv
/ usr / local / include / opencv
)
MESSAGE(状态OpenCV:HighGUI Path: $ {HIGHGUI_INCLUDE_DIR})
FIND_LIBRARY(CV_LIB NAMES opencv_imgproc PATHS
/ usr / lib
/ usr / local / lib
/ usr / lib64
/ usr / local / lib64
)
MESSAGE(状态OpenCV:CV Lib:$ {CV_LIB})
FIND_LIBRARY(CXCORE_LIB NAMES opencv_core PATHS
/ usr / lib
/ usr / local / lib
/ usr / lib64
)
MESSAGE(状态OpenCV:CXCore Lib:$ {CXCORE_LIB} )
FIND_LIBRARY(HIGHGUI_LIB NAMES opencv_highgui PATHS
/ usr / lib
/ usr / local / lib
/ usr / lib64
/ usr / local / lib64
)
MESSAGE(状态OpenCV:HighGUI Lib:$ {HIGHGUI_LIB})
INCLUDE_DIRECTORIES(
$ {HIGHGUI_INCLUDE_DIR}
$ {OPENCV_INCLUDE_DIR}
$ {CXCORE_INCLUDE_DIR}
$ {CVAUX_INCLUDE_DIR}
)
################ #########配置QT包含###############################
FIND_PACKAGE(Qt5Widgets)
FIND_PACKAGE (Qt4 REQUIRED)
include_directories($ {QT_INCLUDES})
IF(QT4_FOUND)
MESSAGE(状态QT found:YES)
ELSE(QT4_FOUND)
MESSAGE (FATAL_ERROR
无法构建没有Qt4。请设置Qt4_DIR。)
ENDIF(QT4_FOUND)
#################添加源, headers和uis #########################
set(SOURCES $ {SOURCES}
main.cpp
VigilWidget.cpp
)
SET(HEADERS $ {HEADERS}
VigilWidget.h
)
SET(UI_FILES
bugView.ui
)
######################## Run UIC上的.ui文件######################### b#
$ b QT4_WRAP_UI(UI_HDRS $ {UI_FILES})
MESSAGE(状态UI_HEADERS:$ {UI_HDRS})
#,最后将运行moc:
#QT4_AUTOMOC($ {HEADERS})
QT4_WRAP_CPP(MOC_HEADERS $ {HEADERS})
########################################### ######
ADD_EXECUTABLE(Vigil $ {UI_HDRS} $ {SOURCES} $ {HEADERS} $ {QtApp_RCC_SRCS} $ {MOC_HEADERS})
我的源文件和头文件目前都是空的,但我也会发布它们,谁知道,也许错误是存在的。
main.cpp:
#include< iostream>
#includeVigilWidget.h
//#include< QApplication>
int main(int argc,char * argv []){
QApplication app(argc,argv);
std :: cout<< 测试;
VigilWidget vigil;
vigil.show();
}
VigilWidget.cpp:
#includeVigilWidget.h
VigilWidget :: VigilWidget(QWidget * parent)
:QWidget(parent)
{
ui.setupUi(this);
}
VigilWidget.h:
#ifndef _BGSUBTRACT_H_
#define _BGSUBTRACT_H_
#includeui_bugView.h
//#include< QObject>
class VigilWidget:public QWidget {
Q_OBJECT
public:
私有插槽:
信号:
私有插槽:
private:
Ui :: bugView ui;
};
#endif
无论如何,我花了两天的最好的一部分,真的很感谢一些帮助!非常感谢!
解决方案Qt5配置:
set(QT_VERSION_REQ5.2)
find_package(Qt5Core $ {QT_VERSION_REQ} REQUIRED)
find_package(Qt5Quick $ {QT_VERSION_REQ} REQUIRED)
find_package(Qt5Widgets $ {QT_VERSION_REQ } REQUIRED)
set(CMAKE_AUTOMOC ON)
add_executable($ {PROJECT_NAME} $ {SOURCES})
target_link_libraries($ {PROJECT_NAME}
Qt5 :: Core
Qt5 :: Quick
Qt5 :: Widgets
)
如果你可以更好地使用QtQuick而不是QWidgets。
I am trying to write an OpenCV application creating the GUI with QT and generating the makefiles using CMAKE. The problem that I have is that when I try to execute the "make" command, I get the error:
#error "This file was generated using the moc from 5.2.1. It cannot be used with the include files from this version of Qt. (The moc has changed too much.)"
Okay...so I guess I should be trying to use the moc from qt4 rather than qt5 for this (I have both qt4 and qt5 installed). Sure enough I have /usr/bin/moc-qt4 as well as /usr/bin/moc, so I would have thought all I need to do is invoke sudo update-alternatives --config moc, but all I get is update-alternatives: error: no alternatives for moc. Hmmm...
So I think the issue is either with the version of qt or in my CMakeLists.txt, so here is the code I used for that:
cmake_minimum_required(VERSION 2.8.9) project (Vigil) include_directories( build src inc uis ) ######################### Configure OpenCV inclusion ######################### FIND_PATH(CV_INCLUDE_DIR cv.h /usr/include/opencv ) MESSAGE(STATUS "OpenCV: CV Path : " ${CV_INCLUDE_DIR}) FIND_PATH(CVAUX_INCLUDE_DIR cvaux.h /usr/include/opencv /usr/local/include/opencv /usr/local/include/opencv/cvaux/include /usr/local/include/opencv/include ) MESSAGE(STATUS "OpenCV: CVAux Path : " ${CXCORE_INCLUDE_DIR}) FIND_PATH(CXCORE_INCLUDE_DIR cxcore.h /usr/include/opencv /usr/local/include/opencv /usr/local/include/opencv/cxcore/include ) MESSAGE(STATUS "OpenCV: CXCore Path : " ${CVAUX_INCLUDE_DIR}) FIND_PATH(HIGHGUI_INCLUDE_DIR highgui.h /usr/include/opencv /usr/local/include/opencv/otherlibs/highgui /opt/local/include/opencv /usr/local/include/opencv ) MESSAGE(STATUS "OpenCV: HighGUI Path : " ${HIGHGUI_INCLUDE_DIR}) FIND_LIBRARY(CV_LIB NAMES opencv_imgproc PATHS /usr/lib /usr/local/lib /usr/lib64 /usr/local/lib64 ) MESSAGE(STATUS "OpenCV: CV Lib: " ${CV_LIB}) FIND_LIBRARY(CXCORE_LIB NAMES opencv_core PATHS /usr/lib /usr/local/lib /usr/lib64 ) MESSAGE(STATUS "OpenCV: CXCore Lib: " ${CXCORE_LIB}) FIND_LIBRARY(HIGHGUI_LIB NAMES opencv_highgui PATHS /usr/lib /usr/local/lib /usr/lib64 /usr/local/lib64 ) MESSAGE(STATUS "OpenCV: HighGUI Lib: " ${HIGHGUI_LIB}) INCLUDE_DIRECTORIES( ${HIGHGUI_INCLUDE_DIR} ${OPENCV_INCLUDE_DIR} ${CXCORE_INCLUDE_DIR} ${CVAUX_INCLUDE_DIR} ) ######################### Configure QT inclusion ######################### FIND_PACKAGE(Qt5Widgets) FIND_PACKAGE(Qt4 REQUIRED) include_directories( ${QT_INCLUDES} ) IF(QT4_FOUND) MESSAGE(STATUS "QT found : YES") ELSE(QT4_FOUND) MESSAGE(FATAL_ERROR "Cannot build without Qt4. Please set Qt4_DIR.") ENDIF(QT4_FOUND) ######################### Add sources, headers and uis ######################### set(SOURCES ${SOURCES} main.cpp VigilWidget.cpp ) SET( HEADERS ${HEADERS} VigilWidget.h ) SET( UI_FILES bugView.ui ) ######################### Run UIC on .ui files ######################### QT4_WRAP_UI( UI_HDRS ${UI_FILES} ) MESSAGE(STATUS "UI_HEADERS: " ${UI_HDRS}) # and finally this will run moc: #QT4_AUTOMOC(${HEADERS}) QT4_WRAP_CPP( MOC_HEADERS ${HEADERS} ) ######################### ######################### ADD_EXECUTABLE(Vigil ${UI_HDRS} ${SOURCES} ${HEADERS} ${QtApp_RCC_SRCS} ${MOC_HEADERS})
My source and header files are pretty empty at the moment, but I will post them too. Who knows, maybe the error is there.
main.cpp:
#include <iostream> #include "VigilWidget.h" //#include <QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); std::cout << "Testing"; VigilWidget vigil; vigil.show(); }
VigilWidget.cpp:
#include "VigilWidget.h" VigilWidget::VigilWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); }
VigilWidget.h:
#ifndef _BGSUBTRACT_H_ #define _BGSUBTRACT_H_ #include "ui_bugView.h" //#include <QObject> class VigilWidget : public QWidget{ Q_OBJECT public: private slots: signals: private slots: private: Ui::bugView ui; }; #endif
Anyways, I have spent the best part of two days getting this far and would really really appreciate some help! Thanks a lot!
解决方案Config for Qt5:
set(QT_VERSION_REQ "5.2") find_package(Qt5Core ${QT_VERSION_REQ} REQUIRED) find_package(Qt5Quick ${QT_VERSION_REQ} REQUIRED) find_package(Qt5Widgets ${QT_VERSION_REQ} REQUIRED) set(CMAKE_AUTOMOC ON) add_executable(${PROJECT_NAME} ${SOURCES}) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Quick Qt5::Widgets )
And better use QtQuick instead of QWidgets if you can.
这篇关于使用CMAKE的QT MOC错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!