grig_p
grig_p31 марта 2017 г. 7:38

Вопрос по статье "Qt WinAPI - Урок 004. QtIFW ..." Ошибка в copydata

Здравствуйте! Создал проект с поддиректориями "Проект + инсталлятор", как показано в статье: https://evileg.com/post/164/ Но при сборке инсталлятора возникает ошибка [copydata] Error 4 Что это и куда копать? Вот мой код Installer.pro:

TEMPLATE = aux

# В зависимости от режима сборки, определяем, куда именно будут собираться инсталляторы
CONFIG(debug, debug|release) {
    INSTALLER_OFFLINE = $$OUT_PWD/../../TSInstallerDebug/TreeStorage.offline
    INSTALLER_ONLINE = $$OUT_PWD/../../TSInstallerDebug/TreeStorage.online
    DESTDIR_WIN = $$PWD/packages/ru.ntcmks.treestorage/data
    DESTDIR_WIN ~= s,/,\\,g
    PWD_WIN = $$OUT_PWD/../../TreeStorageDebug
    PWD_WIN ~= s,/,\\,g

    copydata.commands = $(COPY_DIR) $$PWD_WIN $$DESTDIR_WIN
    first.depends = $(first) copydata
    export(first.depends)
    export(copydata.commands)
    QMAKE_EXTRA_TARGETS += first copydata
} else {
    # Задаём переменные, которые будут содержать пути с названиями инсталляторов
    INSTALLER_OFFLINE = $$OUT_PWD/../../TSInstallerRelease/TreeStorage.offline
    INSTALLER_ONLINE = $$OUT_PWD/../../TSInstallerRelease/TreeStorage.online

    # Задаём переменную, которая должна содержать путь к папке с данными
    DESTDIR_WIN = $$PWD/packages/ru.ntcmks.treestorage/data
    DESTDIR_WIN ~= s,/,\\,g
    # Задаём путь откуда всё приложение с DLL-ками нужно будет скопировать
    PWD_WIN = $$OUT_PWD/../../TreeStorageRelease
    PWD_WIN ~= s,/,\\,g

    # Прежде, чем выполнять сборку инсталляторов, необходимо скопировать файлы
    # из выходной папки проекта вместе со всеми DLL в папку data, которая относится
    # к собираемому пакету
    copydata.commands = $(COPY_DIR) $$PWD_WIN $$DESTDIR_WIN
    first.depends = $(first) copydata
    export(first.depends)
    export(copydata.commands)
    # задаём кастомную цель сборки, при которой сначала выполним компирование файлов
    # а потом уже и остальное, что следует по скрипту QMake
    QMAKE_EXTRA_TARGETS += first copydata
}

# Создаём цель по сборке Оффлайн Инсталлятора
INPUT = $$PWD/config/config.xml $$PWD/packages
offlineInstaller.depends = copydata
offlineInstaller.input = INPUT
offlineInstaller.output = $$INSTALLER_OFFLINE
offlineInstaller.commands = $$(QTDIR)/../../QtIFW2.0.5/bin/binarycreator --offline-only -c $$PWD/config/config.xml -p $$PWD/packages ${QMAKE_FILE_OUT}
offlineInstaller.CONFIG += target_predeps no_link combine

QMAKE_EXTRA_COMPILERS += offlineInstaller

# Создаём цель по сборке Онлайн Инсталлятора
INPUT = $$PWD/config/config.xml $$PWD/packages
onlineInstaller.depends = copydata
onlineInstaller.input = INPUT
onlineInstaller.output = $$INSTALLER_ONLINE
onlineInstaller.commands = $$(QTDIR)/../../QtIFW2.0.5/bin/binarycreator --online-only -c $$PWD/config/config.xml -p $$PWD/packages ${QMAKE_FILE_OUT}
onlineInstaller.CONFIG += target_predeps no_link combine

QMAKE_EXTRA_COMPILERS += onlineInstaller

# репозиторий будем собирать только в случае режима release
CONFIG(release, debug|release) {
    # Сборку репозитория производим после того, как были собраны Инсталляторы
    # Для этого воспользуемся QMAKE_POST_LINK вместо QMAKE_EXTRA_COMPILERS
    # Поскольку он хорошо для этого подходит
    QMAKE_POST_LINK += $$(QTDIR)/../../QtIFW2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
}

DISTFILES += \
    config/config.xml \
    packages/com.ntcmks.treestorage/meta/package.xml
config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>TreeStorage</Name>
    <Version>1.0.0</Version>
    <Title>1.0.0 TreeStorage Installer</Title>
    <Publisher>NtcMks</Publisher>
    <StartMenuDir>TreeStorage</StartMenuDir>
    <TargetDir>@TargetDir@/TreeStorage</TargetDir>
        <AllowSpaceInPath>true</AllowSpaceInPath>
    <RemoteRepositories>
        <Repository>
            <Url>http://www.ntcmks.ru/software/TreeStorage/</Url>
        </Repository>
    </RemoteRepositories>
</Installer>
package.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Package>
    <DisplayName>Приложение TreeStorage</DisplayName>
    <Description>Приложение TreeStorage</Description>
    <Version>0.1.0</Version>
    <ReleaseDate>2017-03-30</ReleaseDate>
        <Default>true</Default>
    <Name>com.ntcmks.treestorage</name>
    <ForcedInstallation>true</ForcedInstallation>
    <RequiresAdminRights>true</RequiresAdminRights>
</Package>
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

16
Evgenii Legotckoi
  • 31 марта 2017 г. 9:09

Первое, что бросается в глаза, так это то, что не всю копипасту переправили. Посмотрите внимательно на этот участок кода, да и вообще весь проект внимательно пересмотрите.

CONFIG(release, debug|release) {
    # Сборку репозитория производим после того, как были собраны Инсталляторы
    # Для этого воспользуемся QMAKE_POST_LINK вместо QMAKE_EXTRA_COMPILERS
    # Поскольку он хорошо для этого подходит
    QMAKE_POST_LINK += $$(QTDIR)/../../QtIFW2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
}

Ещё как вариант, может быть проблема с переменной QTDIR , если она не установлена в путях операционной системы. Ищите в настройках системы переменные среды (PATH) и проверьте, есть ли там QTDIR.

    grig_p
    • 31 марта 2017 г. 9:32

    Спасибо за ответ. Копипасту поправил.

    Посмотрел пути $$OUT_PWD Но выяснилось, что правильными путями оказались не PWD_WIN = $$OUT_PWD/../../TreeStorageDebug, а PWD_WIN = $$OUT_PWD/../TreeStorageDebug

    Поправил. Ошибка ушла.

    Но появилась другая: :-1: ошибка: [../TSInstallerDebug/TreeStorage.offline] Error 1

    Вставил в TSInstaller.pro message($$(QTDIR)/../../QtIFW2.0.5/bin/repogen)

    Выдало в сообщениях :Project MESSAGE: D:\QT\5.8\mingw53_32/../../QtIFW2.0.5/bin/repogen

    В настройках Qt в переменная QTDIR настроена правильно Заранее спасибо за совет

      Evgenii Legotckoi
      • 31 марта 2017 г. 9:37

      Относительно правильности путей, то это уже вопрос к структуре проекта.

      Что касается ошибки, то а где именно установлен QtIFW ? Пути совпадают? Или всё-таки нет?

        grig_p
        • 4 апреля 2017 г. 3:32

        Спасибо за ответ! Пути, похоже, все на месте. При сборке ошибка звучит так: :-1: ошибка: [../TSInstallerDebug/TreeStorage.offline] Error 1 Пытаюсь вывести: error($$INSTALLER_OFFLINE) Выводит: :-1: ошибка: D:\Grig\QTProjects\TreeStorageDeploy\build-TreeStorageDeploy-Desktop_Qt_5_8_0_MinGW_32bit-Debug\TSInstaller\..\TSInstallerDebug\TreeStorage.offline Папка ...\TSInstallerDebug\ имеется. TreeStorage.offline отсутствует QT установлен на D диске D:\QT QtIFW установлен внутри папки QT: D:\QT\QtIFW2.0.5 Путь $$(QTDIR)/../../QtIFW2.0.5/bin/binarycreator указывает правильно Заранее благодарен за помощь. Прикрепил проект и структуру папок.

          Evgenii Legotckoi
          • 4 апреля 2017 г. 12:34
          • Ответ был помечен как решение.

          Структура проекта несколько отличается от той, что я привёл в качестве примера в статье. Я имею ввиду структуру subdirs. Поэтому и были косяки с путями изначально.

          Что касается этой ошибки [../TSInstallerDebug/TreeStorage.offline] Error 1 , то ума не приложу, в чём причина. Я перепилил ваш проект так, что он стал идентичен тому, что приводится в качестве примера. Но мой проект, в отличие от вашего компилируется, собирает все инсталляторы и нормально работает.

          Единственное, что могу предположить, что какой-то косяк в кодировке файла и присутствует битый символ, который или не виден или идентичен русскому символу, чаще всего это буква С . Я таким сталкивался, но не в ситуации с инсталляторами. Лечение проблемы было весьма топорным, пересоздать проект заново... Благо это было на раннем этапе.

          Скачайте из статьи пример с инсталляторами (в конце статьи). Там была проблема со скачиванием, но я её пофиксил (права на чтение у файла отсутствовали)

            grig_p
            • 5 апреля 2017 г. 3:13

            Спасибо. Ваш проект скачал. Попробую.

              grig_p
              • 10 апреля 2017 г. 2:27

              Прошу прощения за поздний ответ. Был занят. Смог попробовать только сейчас. Взял Ваш проект. Ничего не меняя попытался собрать. Hello собрался без ошибок. А вот Installer выдает примерно то же самое, что у меня: :-1: ошибка: [../../InstallerDebug/Hello.offline] Error 2

                Evgenii Legotckoi
                • 10 апреля 2017 г. 2:40

                У вас какой Qt installer Framework установлен? У меня тот проект писался под QtIFW2.0.3, возможно, нужно поменять версию в installer.pro . Там в трёх строчках.

                  grig_p
                  • 10 апреля 2017 г. 4:00

                  Спасибо. Поменял путь и получилось.

                    grig_p
                    • 28 апреля 2017 г. 3:16

                    Здравствуйте!
                    Озадачился созданием online инсталляторов.
                    Я так понял, что при сборке в режиме release должны создаваться инсталляторы для режима release в папке InstallerRelease и репозиторий в папке repository на том же уровне, что и папка InstallerRelease. Я прав?
                    У меня создаются файлы Hello.offline.exe и Hello.online.exe в папке InstallerRelease, а папка repository не создается ни на одном уровне с InstallerRelease, ни на каком другом.
                    Проект использую HelloInstaller.
                    Заменил в коде Installer.pro

                    QMAKE_POST_LINK += $$(QTDIR)/../../QtIFW_2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
                    на
                    onlineInstaller.commands = $$(QTDIR)/../../QtIFW2.0.5/bin/repogen -p $$PWD/packages -i ru.evileg.helloinstaller --update $$OUT_PWD/../../repository
                    Репозиторий создается, как надо.
                    В чем может быть проблема?
                      Evgenii Legotckoi
                      • 28 апреля 2017 г. 7:19

                      Больше ничего не меняли в коде? Например, url определение пакета? -> (ru.evileg.helloinstaller)

                        grig_p
                        • 28 апреля 2017 г. 7:28

                        менял только номер версии QtIFW с 2.0.3 на 2.0.5
                        Кстати, у меня в вопросе написано с ошибкой в пути.
                        Вместо QtIFW2.0.5 написано QtIFW_2.0.5 Но в этом случае должна быть ошибка сборки, а она не возникает, собирается нормально.

                          Evgenii Legotckoi
                          • 28 апреля 2017 г. 7:30

                          А в коде как написано? Также с нижним подчёркиванием? Если так, то вполне возможно, что из-за этого и не работает.

                            grig_p
                            • 28 апреля 2017 г. 7:39

                            В коде не работает как с подчеркиванием, так и без него. Причем, с подчеркиванием даже не сообщает об ошибке.

                              Evgenii Legotckoi
                              • 28 апреля 2017 г. 7:46

                              Вообще странно, должно работать. Разве только сам QMAKE чудит. Но у меня мыслей нет на этот счёт.

                                grig_p
                                • 28 апреля 2017 г. 7:51

                                Понятно. Спасибо.

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  m
                                  • moreSpb
                                  • 18 марта 2024 г. 22:32

                                  C++ - Тест 003. Условия и циклы

                                  • Результат:85баллов,
                                  • Очки рейтинга6
                                  в

                                  C++ - Тест 003. Условия и циклы

                                  • Результат:50баллов,
                                  • Очки рейтинга-4
                                  l

                                  C++ - Тест 005. Структуры и Классы

                                  • Результат:91баллов,
                                  • Очки рейтинга8
                                  Последние комментарии
                                  k
                                  kmssr9 февраля 2024 г. 2:43
                                  Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  АК
                                  Анатолий Кононенко5 февраля 2024 г. 9:50
                                  Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  EVA
                                  EVA25 декабря 2023 г. 18:30
                                  Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                  J
                                  JonnyJo25 декабря 2023 г. 16:38
                                  Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                  G
                                  Gvozdik19 декабря 2023 г. 5:01
                                  Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                  Сейчас обсуждают на форуме
                                  P
                                  Pisych27 февраля 2023 г. 12:04
                                  Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                                  AC
                                  Alexandru Codreanu19 января 2024 г. 19:57
                                  QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
                                  BlinCT
                                  BlinCT27 декабря 2023 г. 16:57
                                  Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
                                  Дмитрий
                                  Дмитрий10 января 2024 г. 12:18
                                  Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
                                  Evgenii Legotckoi
                                  Evgenii Legotckoi12 декабря 2023 г. 14:48
                                  Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

                                  Следите за нами в социальных сетях