c++ - 从 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)
解决方案
推荐阅读
- java - 如何将数组插入到 JavaFx 中的 TableView 中?
- javascript - 如何在javascript中调用具有多个值的函数?移相器3
- python - 使用行索引将值分配给 numpy 数组
- java - -Dio.netty.leakDetection.level JVM选项在spring应用程序中没有spring-boot-starter jar依赖项不起作用
- git - GIT - 查找本地分支中提交的所有文件
- python - Twitter 付费高级 API 搜索返回“Twitter 请求错误 422”
- azure - 无法下载 Azure 订阅的发票
- mysql - mysql:/usr/local/lib/libssl.so.1.1:未找到版本“OPENSSL_1_1_1”(mysql 需要)
- python - 如何在 SQLAlchemy 中自动映射自定义 SQL 查询的结果集
- aws-auto-scaling - AWS Auto Scaling 单节点组?