CMake Qt5 не может создать файл заголовка для файла пользовательского интерфейса AUTOUIC



Я не могу создать заголовок для моих файлов пользовательского интерфейса с cmake 3.5.2 и Qt 5.9.



Мои CMakeFileLists.txt:



cmake_minimum_required(VERSION 3.5)
project( fc_app )
message( STATUS "Configuring project")


set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

message( STATUS "search OpenCV")
find_package(
OpenCV
3.2.0
REQUIRED
)

message( STATUS "search Qt")
find_package(
Qt5
5.5.1
REQUIRED
Core
Gui
Widgets
Multimedia
)

message( STATUS "search Boost")
find_package(
Boost
1.58.0
REQUIRED
)


file( GLOB_RECURSE source_files src/* )
file( GLOB_RECURSE header_files include/* )
file( GLOB_RECURSE ui_files ui/* )
file( GLOB_RECURSE res_files res/* )

add_executable(
fc_app
${source_files}
${header_files}
${ui_files}
)

target_link_libraries(
fc_app
${OpenCV_LIBS}
Qt5::Widgets
Qt5::Multimedia
${Boost_LIBRARIES}
)


Я получаю следующую ошибку (в make), когда я запускаю cmake .. & make в корневом каталоге/build/. Ui-файл представляет собой простое QMainWindow с 2 кнопками в нем, поэтому я не понимаю, почему генерация ui_mainwindow.ч не удалось. Я попытался переделать файл пользовательского интерфейса с помощью другой версии Qt5 Designer.



File '/blablablabla/mainwindow.ui' is not valid
AUTOUIC: error: process for ui_mainwindow.h needed by
"/blablablabla/mainwindow.cpp"
failed:
File '/blablablabla/mainwindow.ui' is not valid
879   2  

2 ответов:

Есть странность с CMake и QT для AUTOUIC. Это утверждал , Что CMake будет автоматически сканировать файлы для ui file includes, хотя это не работает, если ui include находится на первой строке исходного файла.

Итак, следующая настройка:

CMakeLists.txt:

project("proj")

set(CMAKE_PREFIX_PATH "$ENV{QTDIR}")
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)

set(CMAKE_INCLUDE_CURRENT_DIR "YES")
set(CMAKE_AUTOMOC "YES")
set(CMAKE_AUTOUIC "YES")

add_executable("proj" MACOSX_BUNDLE main.cpp)
target_link_libraries("proj" Qt5::Core Qt5::Widgets)

form.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
 </widget>
 <resources/>
 <connections/>
</ui>

Не удастся скомпилировать с main.cpp, имеющим:

1. #include "ui_form.h"
2.
3. int main() {
4. }
$ cmake --build .
Scanning dependencies of target proj_automoc
[ 25%] Automatic moc and uic for target proj
Generating moc compilation proj_automoc.cpp
[ 25%] Built target proj_automoc
Scanning dependencies of target proj
[ 50%] Building CXX object CMakeFiles/proj.dir/main.cpp.o
main.cpp:1:10: fatal error: 'ui_form.h' file not found
#include "ui_form.h"
         ^
1 error generated.
make[2]: *** [CMakeFiles/proj.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/proj.dir/all] Error 2
make: *** [all] Error 2

Однако, если ваш ИП не на первом строка:

1. 
2. #include "ui_form.h"
3. int main() {
4. }
$ cmake --build .
[ 25%] Automatic moc and uic for target proj
Generating ui header ui_form.h
[ 25%] Built target proj_automoc
Scanning dependencies of target proj
[ 50%] Building CXX object CMakeFiles/proj.dir/main.cpp.o
[ 75%] Building CXX object CMakeFiles/proj.dir/proj_automoc.cpp.o
[100%] Linking CXX executable proj.app/Contents/MacOS/proj
[100%] Built target proj

UPD. это регулярное выражение , используемое для поиска include, является виновником:

this->UicRegExpInclude.compile("[\n][ \t]*#[ \t]*include[ \t]+"
                               "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]");

Он все еще присутствует в последнем выпуске 3.10.2, но уже исправлен в master:

Uic_.RegExpInclude.compile("(^|\n)[ \t]*#[ \t]*include[ \t]+"
                           "[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]");

Я не знаю, является ли эта проблема для этой конкретной версии CMake, но a имел ту же проблему и выпустил, что если ваш ui файл имеет заглавные буквы, например MuyWidget.ui, то у вас есть эта ошибка с CMake. Решением для меня было назвать файлы ui в нижнем регистре как mywidget.ui вместо MyWidget.ui.

Comments

    Ничего не найдено.