qmlcachegen через CMake: не удалось найти установку Qt «

#cmake #qt5 #qmake

#cmake #qt5 #qmake

Вопрос:

У меня есть операционная система на базе Linux, которая по умолчанию не предоставляет a default.conf qtchooser , что приводит к:

 $ qmake
qmake: could not find a Qt installation of ''

$ qmlcachegen
qmlcachegen: could not find a Qt installation of ''
 

Как правило, вы бы решили эту проблему, указав версию вручную:

 $ qmake -qt5 -v
QMake version 3.1
Using Qt version 5.11.3 in /usr/lib/x86_64-linux-gnu

$ QT_SELECT=5 qmake -v
QMake version 3.1
Using Qt version 5.11.3 in /usr/lib/x86_64-linux-gnu
 

Это также можно решить, создав такие файлы, как:

  • /etc/xdg/qtchooser/default.conf
  • /usr/share/qtchooser/default.conf
  • и т.д.

Однако ради этого вопроса моя ОС не предоставляет этот файл.

Проблема

При использовании CMake 3.13.4 это работает нормально (необязательно, предоставляя -DCMAKE_PREFIX_PATH=/path/to/qt ):

 find_package(Qt5 REQUIRED COMPONENTS Core)

qt5_add_resources(RESOURCES assets.qrc)

target_link_libraries(my_app PUBLIC
        Qt5::Core)
 

Однако при попытке использовать компиляцию QML с опережением времени нам предлагается заменить qt5_add_resources() на qtquick_compiler_add_resources()

 find_package(Qt5 REQUIRED COMPONENTS Core QuickCompiler)

qtquick_compiler_add_resources(RESOURCES assets.qrc)

[...]
 

Которая будет использоваться /usr/lib/x86_64-linux-gnu/cmake/Qt5QuickCompiler/Qt5QuickCompilerConfig.cmake для определения местоположения двоичного qmlcachegen файла и использовать его для компиляции файлов QML.

Таким образом, CMake в конечном итоге делает что-то вроде execve("/usr/bin/qmlcachegen", resource_files); .

Но /usr/bin/qmlcachegen не знает ни о какой установке Qt, поэтому она завершается с ошибкой:

 [ 15%] Generating qml_components_ChatScrollToBottomButton_qml.cpp
make[3]: *** [src/CMakeFiles/conversations_autogen.dir/build.make:85: src/qml_components_Chat_qml.cpp] Error 1
qmlcachegen: could not find a Qt installation of ''
 

Вопрос

Несмотря на то, что мы использовали CMake для определения того, какую установку Qt использовать, qmlcachegen она имеет свою собственную логику для поиска пути к Qt. Судя по Qt5QuickCompilerConfig.cmake тому, что нет способа предоставить переменную среды QT_SELECT или передать -qt5 аргумент.

  1. Несет ли моя ОС ответственность за предоставление a default.conf , чтобы Qt мог найти установку?
  2. Несет ли CMake ответственность за правильную передачу необходимого контекста перед вызовом qmlcachegen ?

Ответ №1:

qt5-default добавляет /usr/lib/x86_64-linux-gnu/qtchooser//default.conf и, таким образом qmake , и qmlcachegen сможет найти установку Qt по умолчанию.