cpack cmake windows АБСОЛЮТНЫЙ путь УСТАНОВИТЬ НАЗНАЧЕНИЕ запрещено

Я пытаюсь использовать cpack с cmake и nsis для создания установщика, который добавляет файлы .exe, сгенерированные в переменную среды.

У меня есть основной cmakelist.txt

в котором я добавляю подкаталог с add_subdirectory(, в каждом подкаталоге есть cmakelist.txt.

в главном подкаталоге в конце пока я добавил:

SET(CPACK_NSIS_MODIFY_PATH ON) SET(CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION OFF) INCLUDE(CPack)

и в каждую "подписку" cmakelist.txt я добавил: SET(CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION OFF) INCLUDE(CPack)

У меня такая ошибка:

CPack: Создать пакет с помощью NSIS CPack: Установить проекты CPack: - Установить проект: MIALSRTK Ошибка CMake в D: ... АБСОЛЮТНЫЙ путь УСТАНОВИТЬ НАЗНАЧЕНИЕ запрещено (вызывающим):

(вот почему я попробовал: SET (CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION OFF), но это ничего не изменило). Я тоже пробовал работать от имени администратора.

Я также попробовал решение здесь: CPack NSIS, создать установщик для Windows

но если (pack) не работает. он переходит в часть else (pack) (я использовал командное сообщение, чтобы увидеть, куда он идет).

Вы знаете, как решить эту проблему?


person p.deman    schedule 11.12.2017    source источник


Ответы (1)


Установка переменной CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION для генерации проверки CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION для NS не может отключить :

Некоторые генераторы CPack, такие как NSIS, обеспечивают это внутренне.

С генератором NSIS у вас нет другого выхода, кроме использования относительных путей установки.


Построение if(pack) будет работать только в том случае, если вы явно передадите pack переменную в cmake. У CMakeLists.txt нет неявного способа определить, запущен ли он под CPack.

person Tsyvarev    schedule 11.12.2017
comment
хорошо, я добавил SET (Pack True CACHE BOOL Use CPACK) в основной cmakelist.txt, и, по крайней мере, он попадает в хороший оператор if. но место назначения по-прежнему не очень хорошее. он не попадает в каталог bin. Сообщение IF (Pack) (я здесь) INSTALL (TARGETS mialsrtkRefineHRMaskByIntersection DESTINATION bin) Сообщение ELSE (Pack) (меня здесь не должно быть) INSTALL (TARGETS mialsrtkRefineHRMaskByIntersection CMAKEIF_INTERSECTION) (Пакет) - person p.deman; 12.12.2017
comment
Что вы имеете в виду под but the destination is still not good? Осталась ли ошибка АБСОЛЮТНЫЙ путь УСТАНОВИТЬ НАЗНАЧЕНИЕ ЗАПРЕЩЕНО? Или что? - person Tsyvarev; 12.12.2017
comment
больше нет, но файлы .exe не находятся в желаемом каталоге. (Я хочу, чтобы все .exe находились в каталоге с именем bin, в папке сборки, откуда я вызываю cmake и cpack. In работает, когда я создаю Install с использованием виртуальной студии в cmake без режима cpack. Но не когда я использую cpack. Я выполняю cmake., Конфигурацию и генерацию с pack = true. Поэтому целевой bin. Я создаю весь проект в Visual Studio. При запуске установки (и .exe не находятся в bin / test). Затем, когда я запускаю cpack., Cpack ищет exe в папке выпуска, созданной по умолчанию виртуальной студией - person p.deman; 12.12.2017
comment
Относительный путь в параметре DESTINATION считается относительно каталога, содержащегося в переменной CMAKE_INSTALL_PREFIX, которую может изменить пользователь. Это хороший стиль для установки чего-либо в этот каталог, в отличие от установки в каталоге сборки. (Кстати, после этапа сборки у вас уже есть программа в каталоге сборки, почему вам нужно установить ее там?). - person Tsyvarev; 12.12.2017
comment
да, я хотел бы, чтобы .exe помещался в cmake_install_prefix / bin. который отлично работает с INSTALL (TARGETS mialsrtkRefineHRMaskByIntersection DESTINATION $ {CMAKE_INSTALL_PREFIX} / bin) без использования cpack. и INSTALL (TARGETS mialsrtkRefineHRMaskByIntersection DESTINATION bin) не воспроизводит то же самое при использовании cpack. после этапа сборки все .exe, которые у меня есть при использовании cpack, находятся в build / Toolbox_subdirectory / Release. Я хотел бы, чтобы все они были в / build / bin, чтобы добавить / build / bin в путь к среде с помощью команды cmake SET (CPACK_NSIS_MODIFY_PATH ВКЛ) (пока не знаю, как именно это сделать) - person p.deman; 12.12.2017
comment
Хм, CPack просто создает файл пакета (в случае NSIS - исполняемый файл установки). Для установки пакета из этого файла необходимо выполнить определенные действия (в случае NSIS - запустить исполняемый файл установки). Вы сделали эти шаги? - person Tsyvarev; 12.12.2017
comment
не уверен что ты имеешь ввиду. Я обнаружил, что документации по использованию cpack / nsis очень мало. на данный момент единственными модификациями того, что работало в cmake, являются: set (CPACK_PACKAGE_NAME CPackTest) SET (CPACK_NSIS_MODIFY_PATH ON) SET (CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION OFF) INCLUDE (CPack) и if (pack), чтобы сделать пункт назначения относительным путем. затем я выполняю настройку и генерацию с помощью cmake-gui. строительство с использованием Visual Studio. а затем попробуйте команду cpack. для создания установщика CPackTest.exe. и это не работает. - person p.deman; 12.12.2017
comment
В этом руководстве я вижу только, как писать CMakeLists.txt для CPack. Он не описывает, как запускать CPack. - person Tsyvarev; 12.12.2017
comment
да, я ничего не нахожу о том, как запустить cpack, по крайней мере, при использовании Windows - person p.deman; 12.12.2017
comment
Что не так с простым поиском в Google для CPack? Например. этот вопрос: stackoverflow.com/questions/13144181/. - person Tsyvarev; 12.12.2017
comment
Я уже смотрел на это. но все равно не понимаю. Я сделал модификацию cmakelist.txt в соответствии с этим. Для этого примера я могу сгенерировать installer.exe. в этом случае в Visual Studio я могу создать Package. но когда я дважды щелкаю по нему, я получаю следующее: окна не могут получить доступ к конкретному устройству, пути или файлу. у вас может не быть соответствующих разрешений для доступа к элементу. даже когда я запускаю его как администратор. - person p.deman; 12.12.2017
comment
Итак, в простом примере в упомянутом вопросе CPack работает правильно. Но в вашем случае все становится не так, когда вы пытаетесь создать пакет. Правильно ли я понял ваш последний комментарий? В таком случае вы, вероятно, захотите обновить свой вопрос, добавив соответствующую информацию: какие команды вы выполняете и какой результат вы получаете (сообщение об ошибке). - person Tsyvarev; 12.12.2017
comment
Если я загружаю ComponentExample.zip, я использую cmake для настройки и генерации, открываю проект в Visual Studio. У меня сгенерирован MyLib-1.0.0-win64.exe. и когда я пытаюсь запустить его, у меня возникает ошибка: окна не могут получить доступ к определенному устройству, пути или файлу. у вас может не быть соответствующих разрешений для доступа к элементу, даже когда я запускаю его от имени администратора. В моем случае, в моем коде, я пока не могу сгенерировать .exe. - person p.deman; 12.12.2017