c++ - 使用CMake的Qt moc错误

标签 c++ qt cmake moc

我正在尝试编写一个 OpenCV 应用程序,使用 Qt 创建 GUI 并使用 CMake 生成 makefile。我遇到的问题是,当我尝试执行 make 命令时,出现错误:

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.)

好的。所以我想我应该尝试使用 qt4 中的 moc 而不是 qt5(我同时安装了 qt4 和 qt5)。果然我有 /usr/bin/moc-qt4 以及 /usr/bin/moc,所以我以为我需要做的就是 调用 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})

目前我的源文件和头文件还很空,但我也会发布它们。谁知道,也许错误就在那里。

主要.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

无论如何,我花了两天的大部分时间才走到这一步,非常感谢您的帮助!非常感谢!

最佳答案

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。

关于c++ - 使用CMake的Qt moc错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36142407/

相关文章:

c++ - 使用没有堆内存分配的接口(interface)的框架应用程序?

c++ - Qt 和 C++ 代码之间的数据传输

c++11 - 使用 cmake 构建和打包 LLVM clang 3.4

c++ - 解决由于类之间的循环依赖而导致的构建错误

c# - 自 C# 以来的 C++ 代码等效吗?

c++ - C++中 "using"关键字背后的逻辑是什么?

c++ - 将两个 Qt 选项卡向右移动,其余部分向左移动

qt - QML 条件绑定(bind)未按预期工作

cmake - 如何让 cMake 仅对项目中的一部分目录使用 Debug 编译模式?

android - CMake : FIND_PACKAGE(Threads) for Android cross-compilation