CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?



我有一个Qt 5.13,64位的Windows项目,我正在从qmake移植到cmake。该项目无法编译生成的mocs_compilation.cpp文件,该文件包括从几个嵌套文件夹生成的对象。它似乎是通过包含的生成的moc_*.cpp文件进行编译的,但在第12个文件中出现了以下消息:

c:\users\marcus\projects\build-videosuite-desktop_x86_windows_msvc2017_pe_64bit-debug \video\libvideo_autogen\UVLADIE3JM/moc_ImageView.cpp(58(:错误C2653:"ImageView":不是类或命名空间名称c: \users\marcus\projects\build-vvideosuite-desktop_x86_windows_msvc2017_pe_64bit-debug \video\libvideo_autogen\UVLADIE3JM/moc_ImageView.cpp(66(:错误C2653:"ImageView":不是类或命名空间名称c: \users\marcus\projects\build-vvideosuite-desktop_x86_windows_msvc2017_pe_64bit-debug \video\libvideo_autogen\UVLADIE3JM/moc_ImageView.cpp(76(:错误C2653:"ImageView":不是类或命名空间名称c: \users\marcus\projects\build-videosuite-desktop_x86_windows_msvc2017_pe_64bit-debug \video\libvideo_autogen\UVLADIE3JM/moc_ImageView.cpp(77(:错误C2270:"metaObject":非成员函数上不允许使用修饰符c: \users\marcus\projects\build-vvideosuite-desktop_x86_windows_msvc2017_pe_64bit-debug \video\libvideo_autogen\UVLADIE3JM/moc_ImageView.cpp(81(:错误C2653:"ImageView":不是类或命名空间名称

它是这样编译的:

C:\PROGRA~2\MICROS~4\2017\PROFES~1\VC\Tools\MSVC\1416~1.270\bin\HostX64\x64\cl.exe/nologo/TP-DQT_CORE_LIB-DQT_GUI_LB-DQT_NETWORK_LB-DQT_OPENGL_LIB—DQT_WIDGETS_LIB—DUNICODE—DWIN64—D_UNICODE—D_USE_MATH_DEFINES—D_WINSOCKAPI_—IVideoProcessor—IC:\Users\marcus\Projects\VideoProcessorSuite\VideoProcessor—IVidedProcessor\libVideoProcessor_autogen\include—IC:\Users\marcus\Projects\VideoProcessorSuite\WideoProcessor\OPENGL—IC:\Users \marcus\Projectes\VideoProcessorSuite \ VideoProcessor\src-IC:\Users\marcus\Projects\VideoProcessorSuite\VideoProcessor\agorithms-IC:\Qt\Qt5.13.0\5.13.0\msvc2017_64\include-IC:\Qt\ Qt5.13.0 \5.13.0\ msvc2017_64\include\QtWidgets-IC:\Q t\Qt5.13.0\513.0\ msvc 2017_64\ include\Qt Gui-IC:\Qt\Q t5.13.0\ 5.13.0\ ms vc2017_64]include\QtANGLE-IC:\ Qt\ Q t5.13.0 \ 5.13.0\ms vc2017_64 include\QtCore-IC:\ Qt\ mkspecs\win32 msvc-IC:\Qt\Qt5.13.0\5.13.0\msvc2017_64\include\QtOpenGL-IC:\Qt\Qt5.13.0\5.13.0\msvc2017_64\include\QtNetwork-I"C:\Program Files\OpenCV 3.4.3\include"-I"C:\ProgramFiles\OpenCV3.4.3\include\opencv"/DWIN32/D_WINDOWS/W3/GR/EHsc/MDd/Zi/Ob0/Od/RTC1/showIncludes/FoVideoProcessor\CMakeFiles\libVideoProcessor.dir\libVideoProcessor_autogen\mocs_compilation.cpp.obj/FdVideoProcessor\CMakeFiles\libVideoProcessor.dir\libVideoProcessor.pdb/FS-c视频处理器\libVideoProcessor_autogen\mocs_compilation.cpp

源代码有类似于以下内容的嵌套文件夹:

-Project/
-CMakeLists.txt
-src/
-Widget.cpp, ImageView.cpp, MainWindow.cpp, etc.
-opengl/
- GlControl.cpp, etc.
-logic/
- Processor.cpp

导致错误的ImageView生成的moc方法文件是mocs_compilation.cpp中的第12个,所以我假设其他包含的文件都可以。ImageView是一个通用的小部件。

#ifndef IMAGEVIEW_H
#define IMAGEVIEW_H
#include <QWidget>
#include <QObject>
namespace Ui {
class ImageView;
}
class ImageView : public QWidget
{
Q_OBJECT
public:
explicit ImageView(QWidget *parent = 0);
~ImageView();
QImage getImage() {return m_image;}
void setImage(QImage &image);
private:
Ui::ImageView *ui;
void paintEvent(QPaintEvent *) override;
QImage m_image;
};
#endif // IMAGEVIEW_H

我的CMakeLists.txt文件如下所示:

cmake_minimum_required(VERSION 3.0.2)
project(VideoProcessor)
find_package(Qt5 COMPONENTS Core Widgets Gui Test Network OpenGL REQUIRED)
find_package(OpenCV COMPONENTS world REQUIRED)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
# for generated files to be read
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# UIC needs to be able to look in nested folders
set(CMAKE_AUTOUIC_SEARCH_PATHS src/ algorithms/ opengl/)
set(CMAKE_CXX_STANDARD 14)
file(GLOB OpenGL_Sources "opengl/*.cpp")
file(GLOB GUI_Sources "src/*.cpp")
file(GLOB Logic_Sources "logic/*.cpp")
# main.cpp is in src/ need to filter it out of the library target
list(FILTER GUI_Sources EXCLUDE REGEX ".*main.cpp$")
include_directories(opengl/)
include_directories(src/)
include_directories(logic/)
add_compile_definitions(_USE_MATH_DEFINES _WINSOCKAPI_ _UNICODE WIN64 UNICODE)
## Tests
#enable_testing()
#add_executable(testing tst_test.cpp)
#target_link_libraries(testing lib${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Network ${OpenCV_LIBS})
#add_test(NAME testing COMMAND  testing)
add_library(lib${PROJECT_NAME} ${OpenGL_Sources} ${GUI_Sources} ${Logic_Sources} "resources.qrc")
target_link_libraries (lib${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Network ${OpenCV_LIBS})
add_executable(${PROJECT_NAME}  "src/main.cpp")
target_link_libraries (${PROJECT_NAME} lib${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Network ${OpenCV_LIBS})

该项目使用qmake进行编译。我还有其他类似的嵌套文件夹Cmake/Qt/OpenCV项目,它们编译起来没有问题。我错过了什么?编译器使用的include标志包括具有ImageView头文件的目录。为什么找不到类声明?这就是这个问题的真正原因吗???

更改:

#ifndef IMAGEVIEW_H
#define IMAGEVIEW_H

#ifndef MYIMAGEVIEW_H
#define MYIMAGEVIEW_H

解决了问题。

最新更新