2017-10-21 197 views
-1

我目前正在将我的项目从QMake移动到CMake,而且我正面临着Qt UIC的一个问题,它尝试处理一个不存在的ui文件,而不是我希望他处理的实际文件。CMake Qt UIC失败

我有以下架构

. 
|___ CMakeLists.txt 
|___ MyProject.pro 
|___ mainwindow.ui 
|___ resource.qrc 
|___ source 
| |___ mainwindow.cpp 
| |___ *.cpp 
|___ include 
| |___ mainwindow.h 
| |___ *.h 

这里是我的cmake

cmake_minimum_required(VERSION 3.2) 

# Project name 
project(project) 

# Tell CMake to compile with C++11 
set(CMAKE_CXX_STANDARD 11) 

# Tell CMake to run moc when needed. 
set(CMAKE_AUTOMOC ON) 

# Tell CMake to run uic when needed. 
set(CMAKE_AUTOUIC ON) 

# Tell CMake to run rcc when needed 
set(CMAKE_AUTORCC ON) 

# Moc generated files are located in the current dir so we need to tell CMake to look for them. 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 

# Find Qt5 
find_package(Qt5 COMPONENTS Widgets Core Gui OpenGL REQUIRED) 
# Add Qt5 definitions and includes to build libraries. 
# Widgets add Widgets Core and Gui 
add_definitions(${Qt5Widgets_DEFINITIONS}) 
include_directories(${Qt5Widgets_INCLUDES}) 

add_definitions(${Qt5OpenGL_DEFINITIONS}) 
include_directories(${Qt5OpenGL_INCLUDES}) 


# Find OpenGL 
find_package(OpenGL REQUIRED) 

# Set include directories 
include_directories(${CMAKE_SOURCE_DIR}/include 

# Use Qt5 ressources 
set(RESOURCE resources.qrc) 
# Use Qt5 ui 
set(UI mainwindow.ui) 

# Adding sources 
set(SOURCES 
    source/main.cpp 
    source/mainwindow.cpp 
    source/octree.cpp 
    source/mesh.cpp 
    source/pgm3d.cpp 
    source/glwidget.cpp 
    source/camera.cpp 
    source/scene.cpp 
    source/light.cpp 
    source/obj.cpp 
    source/alignedbox3f.cpp 
    source/wireboundingbox.cpp 

    include/mainwindow.h 
    include/utils.h 
    include/octree.h 
    include/mesh.h 
    include/pgm3d.h 
    include/glwidget.h 
    include/camera.h 
    include/scene.h 
    include/model3d.h 
    include/light.h 
    include/obj.h 
    include/alignedbox3f.h 
    include/wireboundingbox.h) 


add_executable(${PROJECT_NAME} ${UI} ${RESOURCE} ${SOURCES}) 
target_link_libraries(${PROJECT_NAME} ${Qt5Widgets_LIBRARIES} ${Qt5OpenGL_LIBRARIES} ${OPENGL_LIBRARIES}) 

而且我得到了以下错误:

File '/*/project/source/mainwindow.ui' is not valid 
AUTOUIC: error: process for ui_mainwindow.h needed by 
"/*/project/source/mainwindow.cpp" 
failed: 
File '/*/project/source/mainwindow.ui' is not valid 

这个错误是因为完全合乎逻辑我的源文件夹不包含ui文件。我试图包装ui而不是使用autouic,它也不起作用。

+0

尝试清理build目录缓存和重新开始。另外我会建议不要放在项目目录中的目标文件。保持卫生。 – Joel

+0

已经尝试清理一切,但它没有工作。 – Nico

回答

1

目标(从时创建目标变量CMAKE_AUTOUIC设置)的AUTOUIC属性定义发生器的行为 - 当AUTOUIC属性已启用的CMake将扫描源文件的包括UI文件(如#include "ui_*.h"#include <ui_*.h>)并且将自动uic工具处理它们。
在CMake 3.9中添加了另一个目标属性AUTOUIC_SEARCH_PATHS。类似的问题已经被问到here


你另一种办法是禁用AUTOUIC和使用qt5_wrap_ui与完整路径UI文件:

set(CMAKE_AUTOUIC OFF) 
set(UI ${CMAKE_CURRENT_LIST_DIR}/mainwindow.ui) 
... 
qt5_wrap_ui(UI_HEADERS ${UI}) 
add_executable(${PROJECT_NAME} ${UI_HEADERS} ${RESOURCE} ${SOURCES})