首页 > 解决方案 > 从 QT 5.12.8 迁移到 5.15.2 MOC 失败

问题描述

我们尝试从工作基础 Qt 5.12.8 迁移到最新的 Qt 5 LTSB (5.15.2),但遇到了 MOC 错误:
moc 进程无法将“SRC:GenericForm.h”编译
   为

   SRC:moc_GenericForm.cpp”
输出
   SRC:/workspace/NBCI2/src/base/base_language.(9): "{" 处解析错误

问题出现在每个 Qt 构建更大的 5.12.x 时,我们缺少什么?moc 在 5.12.x 和更高版本之间有什么变化?
构建系统是 cmake
base_language 被一些包含头文件包含。

GenericForm.h:

#pragma once

#include "host.h"
#include "qt_type_defines.h"
#include <qwidget.h>
#include "qt_in_scheduler.h"
#include "qt_out_scheduler.h"
#include "GenericBaseForm.h"

namespace qt
{
    using namespace nbc;
    class GenericForm : public GenericBaseForm
    {
        Q_OBJECT
    public:
        GenericForm(host::ihost * h, const GenericFormConfig & cfg, safe_bool & Shutdown, rmutex & form_creation_mtx);
        virtual ~GenericForm();
        virtual void SetTitleError(bool on);
        virtual void SetTitle(str_cref title_str);
        virtual void SetHintText(str_cref hint_str);
        virtual bool AllowHide();
        virtual void OnLanguageChange(lang_t)
    };
}

基本语言:

#ifndef BASE_LANGAUAGE_H
#define BASE_LANGAUAGE_H

#include "base.h"

namespace base
{
    enum struct lang_t : char
    {
        default = -1,
        english = 0, 
        german = 1, 
        french = 2,
    };

    base::str_t to_string(lang_t);
    lang_t from_string(base::str_cref);
}
#endif

CMake.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 3.17.0 FATAL_ERROR)

SET(VERSION_MAJOR 1)
SET(VERSION_MINOR 0)
SET(VERSION_PATCH 0)

SET(PROJECT_NAME "lib_GenericForms")

# find Qt5 and required components
FIND_PACKAGE(Qt5 COMPONENTS REQUIRED Core Gui Widgets )

#need this to include the auto generated ui_mainwindow.h
#file from the qt5_wrap_ui call below.
IF(CMAKE_VERSION VERSION_LESS "3.7.0")
    SET(CMAKE_INCLUDE_CURRENT_DIR ON)
ENDIF()

INCLUDE_DIRECTORIES( 
)

ADD_DEFINITIONS(  -DBUILD_STATIC -DQT_SUPPORT_LIB
)

SET(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
SET(CMAKE_AUTORCC ON)

SET(ENVIRONMENT_EXTENSION_DEBUG
    ${ENVIRONMENT_EXTENSION}
)   

SET(ENVIRONMENT_EXTENSION_RELEASE
    ${ENVIRONMENT_EXTENSION}
)

#set project sources
SET(PROJECT_SOURCES    
    ${CMAKE_CURRENT_LIST_DIR}/GenericBaseForm.h
    ${CMAKE_CURRENT_LIST_DIR}/GenericBaseForm.cpp
    ${CMAKE_CURRENT_LIST_DIR}/GenericForm.h
    ${CMAKE_CURRENT_LIST_DIR}/GenericForm.cpp
    ${CMAKE_CURRENT_LIST_DIR}/GenericSensorForm.h
    ${CMAKE_CURRENT_LIST_DIR}/GenericSensorForm.cpp
)

SET(PROJECT_RESOURCES
)

#set project sources
SET(PROJECT_UI
)

# setup project
ADD_LIBRARY(${PROJECT_NAME} STATIC
    ${PROJECT_SOURCES}
    ${UI_WRAP}
    ${MOC_SOURCES}
)

TARGET_LINK_LIBRARIES(
    ${PROJECT_NAME}
    PUBLIC
    Qt5::Core
    Qt5::Gui
    Qt5::Widgets
)

GenerateVSUserFile(
    "${ENVIRONMENT_EXTENSION_DEBUG}"
    "${ENVIRONMENT_EXTENSION_RELEASE}"
    "$(TargetDir)"
    "$(TargetDir)"
    "$(TargetPath)"
    "$(TargetPath)"
    ""
    ""
    "${PROJECT_NAME}"
)

GenerateVersionInfo(
    1
    0
    0
    "${PROJECT_NAME}"
    "${PROJECT_NAME}"
    "${PROJECT_NAME}.lib"
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.rc"
    "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_version.h"
)

# Executables fail to build with Qt 5 in the default configuration
# without -fPIE. We add that here.
set(CMAKE_CXX_FLAGS "${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")

#Set the target link subsystem
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS")

#set compiler flasgs
SET(COMPILER_FLAGS "${COMPILER_FLAGS} /MP")
SET(COMPILER_FLAGS "${COMPILER_FLAGS} /EHsc")
SET(COMPILER_FLAGS "${COMPILER_FLAGS} /Zc:wchar_t")
SET(COMPILER_FLAGS "${COMPILER_FLAGS} /wd4290")
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${COMPILER_FLAGS}")

SET(PROJECT_NAME_INCLUDES ${CMAKE_CURRENT_LIST_DIR} PARENT_SCOPE)
SET(PROJECT_NAME_PROJECTNAME "${PROJECT_NAME}" PARENT_SCOPE)

标签: c++qtmoc

解决方案


推荐阅读