CMake Qt UIC failed

2019-08-27 18:15发布

问题:

I'm currently moving my project from QMake to CMake and I'm facing a problem with Qt UIC which try to process an ui file that does not exist instead of the actual file I want him to process.

I have the following architecture

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

And here is my 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})

And I've got the following error:

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

This error is perfectly logical since my source folder does not contain the ui file. I've tried to wrap the ui instead of using autouic and it didn't work either.

回答1:

The AUTOUIC property of the target (which is set from the variable CMAKE_AUTOUIC when the target is created) defines behavior of generator - when AUTOUIC property is enabled CMake will scan source files for the includes of ui files (like #include "ui_*.h" or #include <ui_*.h>) and will automatically process them with uic tool.
In CMake 3.9 another target property was added AUTOUIC_SEARCH_PATHS. Similar question was already asked here.


Another option for you would be to disable AUTOUIC and use qt5_wrap_ui with full path to the UI file:

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


标签: qt cmake qmake uic