Ошибка Qt moc с использованием CMake

Я пытаюсь написать приложение OpenCV, создавая графический интерфейс с помощью Qt и генерируя файлы сборки с помощью 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

В любом случае, я потратил большую часть двух дней, чтобы добраться так далеко, и был бы очень признателен за помощь! Большое спасибо!


person Mr Squid    schedule 21.03.2016    source источник
comment
FIND_PACKAGE(Qt5Widgets) Вы используете Qt4 или Qt5?   -  person Ilya    schedule 22.03.2016
comment
Да ... в этом нет необходимости. Однако после удаления этой строки у меня все еще возникает та же проблема.   -  person Mr Squid    schedule 22.03.2016
comment
Я заменил все это на пакет qt5 - все должно быть в порядке, верно? Теперь он дает мне сообщение об ошибке: Найден файл конфигурации пакета: /usr/lib/x86_64-linux-gnu/cmake/Qt5/Qt5Config.cmake, но он установил Qt5_FOUND в FALSE, поэтому пакет Qt5 считается НЕ НАЙДЕН. Причина, указанная пакетом: для пакета Qt5 требуется как минимум один компонент   -  person Mr Squid    schedule 22.03.2016
comment
Поэтому вам нужно указать хотя бы один компонент при поиске Qt5 с find_package.   -  person Tsyvarev    schedule 22.03.2016
comment
ИМО для нового проекта вы должны использовать Qt5, а не Qt4 (и поэтому начните с Qt5 CMakeLists.txt).   -  person Ilya    schedule 22.03.2016
comment
@Bernhard Heinrich, не слышал о Qt4 по умолчанию для CMake.   -  person Velkan    schedule 23.03.2016


Ответы (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, если можете.

person Velkan    schedule 23.03.2016