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