1 Востаннє редагувалося Teg Miles (23.05.2024 10:49:52)

Тема: Помилка в налаштуваннях CMake

При спробі запуску проєкту Qt на Windows 11 видає таку помилку щодо CMake:

Configuring incomplete, errors occurred!
    Qt6Config.cmake
    qt6-config.cmake
    Qt5Config.cmake
    qt5-config.cmake

  Add the installation prefix of "QT" to CMAKE_PREFIX_PATH or set "QT_DIR" to
  a directory containing one of the above files.  If "QT" provides a separate
  development package or SDK, be sure it has been installed.

На Manjaro все працювало добре. Як це виправити?

CMake файл:

cmake_minimum_required(VERSION 3.5)

project(Movar_cpp VERSION 1.0.2 LANGUAGES CXX)

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

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR}
    REQUIRED COMPONENTS Widgets LinguistTools WebEngineWidgets TextToSpeech)

set(TS_FILES
    i18n/Movar_cpp_uk_UA.ts
    i18n/Movar_cpp_en_US.ts
    i18n/Movar_cpp_ja_JP.ts
)

set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        ${TS_FILES}
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(Movar_cpp
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET Movar_cpp APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation

    #qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
    qt_add_translations(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})

else()
    if(ANDROID)
        add_library(Movar_cpp SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(Movar_cpp
            ${PROJECT_SOURCES}
            dictionarysettings.h dictionarysettings.cpp dictionarysettings.ui
            fileloader.h fileloader.cpp
            app_resources.qrc
            adaptedcompleter.h adaptedcompleter.cpp
            adaptedstringlistmodel.h adaptedstringlistmodel.cpp
        )
    endif()

    qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
endif()

add_custom_target(translations DEPENDS ${QM_FILES})
add_dependencies(${CMAKE_PROJECT_NAME} translations)

target_link_libraries(Movar_cpp PRIVATE
    Qt${QT_VERSION_MAJOR}::Widgets
    Qt${QT_VERSION_MAJOR}::WebEngineWidgets
    Qt${QT_VERSION_MAJOR}::TextToSpeech
    )

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.Movar_cpp)
endif()
set_target_properties(Movar_cpp PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS Movar_cpp
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(Movar_cpp)
endif()
Подякували: leofun011

2

Re: Помилка в налаштуваннях CMake

Тобто ви взяли чисту інсталяцію Windows 11 та запустили збірку свого проєкту?.. А, Qt ви встановлювали? Ви, знову пропонуєте нам вгадувати, що ви робили, а що - ні?

Teg Miles написав:

видає таку помилку щодо CMake

Ну, хоч помилку скопіювали й на тому дякую.

Teg Miles написав:

CMake файл

Бачу у вас є конфіг для Android та iOS, навіщо? Ви збираєте свій проєкт під мобілки? Ви тестували збірку під Android та iOS? Якщо ні, то навіщо вам це в CMake файлі?

Подякували: leofun011

3

Re: Помилка в налаштуваннях CMake

Налаштування для iOS та Android вже були в автоматично згенерованому CMake від Qt.
Вони мені не заважають, тому не чіпаю їх.
Встановив MSVC компілятор і Qt на Віндовс 11, тобто налаштував середовище для роботи.
Скопіював файли проєкту туди, але з'являється вищезгадана помилка.
Не розумію, чому Manjaro бачить нормально всі налаштування в CMake, а Віндовс і Убунту — ні.
Про Убунту дізнався, коли тестував додаток на Github Actions.

4

Re: Помилка в налаштуваннях CMake

Teg Miles написав:

Налаштування для iOS та Android вже були в автоматично згенерованому CMake від Qt.

Тобто, це повністю згенерований Qt файл, не ви його писали? Це їхній Qt Creator так генерує? Гм, як на мене, це, дуже ненадійний підхід. Загалом, я б рекомендував всі залежності додавати як підмодулі (git sub-modules) та дозволити CMake вантажити їх під час конфігурації проєкту. Таким чином, ви б зняли додаткову відповідальність з користувача, робити зайві дії + автоматизація процесу. Але з Qt так, схоже, не вийде. Та й це було б занадто, враховуючи розміри Qt..

Тому, на вашому місці, перше, що я б зробив: переписав CMakeLists.txt та повикидував звідти все, що не використовується. Воно то вам може і не заважає, але хтозна-коли і як воно може вистрілити. Потім, оскільки все ж крок інсталяції Qt ручками пропустити не дуже вийде, я б запропонував додати білд скрипт (build.sh/build.bat), який би перевіряв наявність встановленого Qt й при необхідності [можливо вони лише вінді потрібні?] додавав CMAKE_PREFIX_PATH або QT_DIR (я підозрюю, що вони все ж потрібні, проте, ймовірно, не завжди задаються автоматично, гляньте, що у вас в Manjaro по env змінних) та викликав власне CMake для збірки. І замість виклику напряму CMake використовував цей скрипт. Це додасть трохи більше автоматизації та зручності.

Подякували: leofun011

5

Re: Помилка в налаштуваннях CMake

wander написав:
Teg Miles написав:

Налаштування для iOS та Android вже були в автоматично згенерованому CMake від Qt.

Тобто, це повністю згенерований Qt файл, не ви його писали? Це їхній Qt Creator так генерує? Гм, як на мене, це, дуже ненадійний підхід. Загалом, я б рекомендував всі залежності додавати як підмодулі (git sub-modules) та дозволити CMake вантажити їх під час конфігурації проєкту. Таким чином, ви б зняли додаткову відповідальність з користувача, робити зайві дії + автоматизація процесу. Але з Qt так, схоже, не вийде. Та й це було б занадто, враховуючи розміри Qt..

Тому, на вашому місці, перше, що я б зробив: переписав CMakeLists.txt та повикидував звідти все, що не використовується. Воно то вам може і не заважає, але хтозна-коли і як воно може вистрілити. Потім, оскільки все ж крок інсталяції Qt ручками пропустити не дуже вийде, я б запропонував додати білд скрипт (build.sh/build.bat), який би перевіряв наявність встановленого Qt й при необхідності [можливо вони лише вінді потрібні?] додавав CMAKE_PREFIX_PATH або QT_DIR (я підозрюю, що вони все ж потрібні, проте, ймовірно, не завжди задаються автоматично, гляньте, що у вас в Manjaro по env змінних) та викликав власне CMake для збірки. І замість виклику напряму CMake використовував цей скрипт. Це додасть трохи більше автоматизації та зручності.

Не повністю, частину коду я додав відповідно до потреб проєкту.

6

Re: Помилка в налаштуваннях CMake

Переписав CMake:

cmake_minimum_required(VERSION 3.5)

project(Movar_cpp VERSION 1.0.2 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets
    LinguistTools WebEngineWidgets TextToSpeech)
qt_standard_project_setup()

qt_add_resources(images
    PREFIX "/icons"
    FILES movar.png
)

#qt_add_translations(Movar_cpp
#    TS_FILES
#    i18n/Movar_cpp_uk_UA.ts
#    i18n/Movar_cpp_en_US.ts
#    i18n/Movar_cpp_ja_JP.ts
#    )

qt_add_executable(Movar_cpp
    mainwindow.ui
    mainwindow.h
    mainwindow.cpp
    main.cpp
    dictionarysettings.h
    dictionarysettings.cpp
    dictionarysettings.ui
    fileloader.h
    fileloader.cpp
    app_resources.qrc
    adaptedcompleter.h
    adaptedcompleter.cpp
    adaptedstringlistmodel.h
    adaptedstringlistmodel.cpp
)

target_link_libraries(Movar_cpp PRIVATE
    Qt6::Widgets
    Qt6::WebEngineWidgets
    Qt6::TextToSpeech)

set_target_properties(Movar_cpp PROPERTIES
    WIN32_EXECUTABLE ON
)

install(TARGETS Movar_cpp
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

qt_generate_deploy_app_script(
    TARGET Movar_cpp
    OUTPUT_SCRIPT deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})

Виявилося, що проблема в qt_add_translation. Він чомусь не бачить файли перекладів і пробує створити власну теку.
А ще перестала завантажуватися іконка-логотип в лівий верхній край вікна:

QApplication::setWindowIcon(QIcon(":images/icons/movar.png"));

Що з цим можна вдіяти?

7

Re: Помилка в налаштуваннях CMake

Ще раз переписав CMake, тепер переклади працюють як слід:

cmake_minimum_required(VERSION 3.5)

project(Movar_cpp VERSION 1.0.2 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets
    LinguistTools WebEngineWidgets TextToSpeech)
qt_standard_project_setup()

qt_add_lupdate(
    TS_FILES
    translations/Movar_cpp_en_US.ts
    translations/Movar_cpp_ja_JP.ts
    translations/Movar_cpp_uk_UA.ts

    SOURCES
    mainwindow.cpp
    dictionarysettings.cpp
    fileloader.cpp
    mainwindow.ui
    dictionarysettings.ui
)

qt_add_lrelease(
    TS_FILES
    translations/Movar_cpp_en_US.ts
    translations/Movar_cpp_ja_JP.ts
    translations/Movar_cpp_uk_UA.ts
)

qt_add_executable(Movar_cpp
    mainwindow.ui
    mainwindow.h
    mainwindow.cpp
    main.cpp
    dictionarysettings.h
    dictionarysettings.cpp
    dictionarysettings.ui
    fileloader.h
    fileloader.cpp
    app_resources.qrc
    adaptedcompleter.h
    adaptedcompleter.cpp
    adaptedstringlistmodel.h
    adaptedstringlistmodel.cpp
)

add_dependencies(${CMAKE_PROJECT_NAME} update_translations)

target_link_libraries(Movar_cpp PRIVATE
    Qt6::Widgets
    Qt6::WebEngineWidgets
    Qt6::TextToSpeech)

set_target_properties(Movar_cpp PROPERTIES
    WIN32_EXECUTABLE ON
)

install(TARGETS Movar_cpp
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}

)

Виходить, що qt_add_translation() — це обгортка для qt_add_lupdate() i qt_add_lrelease(),
яка не працює як слід. А ще треба обов'язково додавати add_dependencies(${CMAKE_PROJECT_NAME} update_translations),
бо без цього файли .ts будуть генеруватися порожніми. Це старий баґ з відсутністю update_translations
у вищезгаданих функціях.

Подякували: leofun011

8

Re: Помилка в налаштуваннях CMake

А щоб запрацювало відображення іконки шлях треба вказувати звичайний, а не до qresouces.
Бо компілятор буде шукати саме по звичайному шляху.
Тому треба просто лишити "icons/movar.png", якщо тека з іконками лежить поруч із виконуваним файлом.