2017-10-21 76 views
-1

Je déplace actuellement mon projet de QMake à CMake et je suis confronté à un problème avec Qt UIC qui essaie de traiter un fichier ui qui n'existe pas à la place du fichier que je veux qu'il traite.CMake Qt UIC a échoué

Je l'architecture suivante

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

Et voici mon 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}) 

Et j'ai l'erreur suivante:

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 

Cette erreur est parfaitement logique puisque mon dossier source ne contient pas le fichier ui. J'ai essayé d'envelopper le ui au lieu d'utiliser autouic et ça n'a pas marché non plus.

+0

Essayez de nettoyer le cache du répertoire de construction et recommencer. Aussi, je recommande de ne pas mettre dans le projet dir les fichiers objets. Garde le propre. – Joel

+0

Déjà essayé de tout nettoyer mais ça n'a pas fonctionné. – Nico

Répondre

1

La AUTOUIC propriété de la cible (qui est définie à partir de la CMAKE_AUTOUIC variable lorsque la cible est créée) définit le comportement du générateur - lorsque AUTOUIC propriété est activée CMake fichiers source balayage pour le comprend de fichiers ui (comme #include "ui_*.h" ou #include <ui_*.h>) et automatiquement les traiter avec l'outil uic. Dans CMake 3.9, une autre propriété cible a été ajoutée: AUTOUIC_SEARCH_PATHS. Une question similaire a déjà été posée here.


Une autre option pour vous serait de désactiver AUTOUIC et utiliser qt5_wrap_ui avec le chemin complet du fichier de l'interface utilisateur:

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