Ошибка Qt moc при использовании CMake
Я пытаюсь написать приложение OpenCV, создающее графический интерфейс с Qt и генерирующее make-файлы с использованием CMake. Проблема в том, что когда я пытаюсь выполнить make
Команда, я получаю ошибку:
Этот файл был сгенерирован с использованием moc из 5.2.1. Его нельзя использовать с включаемыми файлами из этой версии Qt. (Мок сильно изменился.)
Хорошо. Поэтому я думаю, что для этого я должен попытаться использовать 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)
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})
Мои исходные файлы и файлы заголовков на данный момент довольно пусты, но я также опубликую их. Кто знает, может быть, ошибка есть.
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
В любом случае, я потратил лучшую часть двух дней, добравшись до этого места, и был бы очень признателен за помощь! Большое спасибо!
1 ответ
Конфиг для 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
)
И лучше используйте QtQuick вместо QWidgets, если можете.