Russian Qt Forum

Компиляторы и платформы => Mac OS X => Тема начата: Igors от Январь 27, 2020, 18:32



Название: Стартует "не оттуда"
Отправлено: Igors от Январь 27, 2020, 18:32
Добрый день

Может какая-то новая "фишка" (OSX 10.14.3). У меня все запускается, у заказчика нет. CrashLog пишет
Цитировать
Dyld Error Message:
  Library not loaded: @executable_path/../../../My Resources/GStreamer.framework/Versions/1.0/GStreamer
  Referenced from: /private/var/folders/*/MyApp.app/Contents/MacOS/MyApp
  Reason: image not found"
Пути настроены "от себя", конечно если app файл попал в /private/var/folders - то фреймворка не найдет и не запустится. Но КАК он там оказался? Юзер никак не мог - он копировал приложение со всеми файлами, о существовании /private/var/folders он не подозревает. И что за * в пути т.е
Цитировать
/private/var/folders/*
Что сие значит?

Спасибо


Название: Re: Стартует "не оттуда"
Отправлено: Авварон от Январь 27, 2020, 19:06
otool -L на MyApp в студию


Название: Re: Стартует "не оттуда"
Отправлено: kambala от Январь 27, 2020, 21:23
@executable_path/../../.. аж на 3 уровня от исполняемого файла указывает, как-то далеко


Название: Re: Стартует "не оттуда"
Отправлено: Igors от Январь 28, 2020, 09:00
otool -L на MyApp в студию
Не вопрос, посмотрим на тот же путь
Цитировать
/Users/igor/Desktop/MyApp/MyApp.app/Contents/MacOS/MyApp:
   @executable_path/libQt5Core.dylib (compatibility version 5.12.0, current version 5.12.1)
   @executable_path/libQt5Gui.dylib (compatibility version 5.12.0, current version 5.12.1)
   @executable_path/libQt5Widgets.dylib (compatibility version 5.12.0, current version 5.12.1)
   @executable_path/libQt5OpenGL.dylib (compatibility version 5.12.0, current version 5.12.1)
   @executable_path/libQt5Designer.dylib (compatibility version 5.12.0, current version 5.12.1)
   @executable_path/libQt5Multimedia.dylib (compatibility version 5.12.0, current version 5.12.1)
   @executable_path/libQt5Network.dylib (compatibility version 5.12.0, current version 5.12.1)
   @executable_path/libQt5PrintSupport.dylib (compatibility version 5.12.0, current version 5.12.1)
   /System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.10)
   @executable_path/SuperPro (compatibility version 1.0.0, current version 1.0.0)
   @executable_path/../../../My Resources/GStreamer.framework/Versions/1.0/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.0.0)
   /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
   /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 23.0.0)
   @executable_path/../../../My Resources/GStreamer.framework/Versions/1.0/GStreamer (compatibility version 0.0.0, current version 0.0.0)
   /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1555.10.0)
   /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
   /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
   /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
   /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1670.0.0)
   /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 50.1.0)
   /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1555.10.0)
   /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 933.0.0)
@executable_path/../../.. аж на 3 уровня от исполняемого файла указывает, как-то далеко
Структура такая
Цитировать
MyApp (folder)
  MyApp.app   (bundle)
  My Resources (folder)
    GStreamer.framework (folder)
Ну вот и получается на 3 уровня от исполняемого файла что сидит в bundle.

Да, и на моей машине все бычит.


Название: Re: Стартует "не оттуда"
Отправлено: kambala от Январь 28, 2020, 10:29
а, My Resources не в пакете приложения лежит, тогда понятно :)

а юзер случайно не прямо из архива пытается приложение запустить? /private/var/folders/* — это скорее всего временная папка. Например, в нее мог извлечься только MyApp.app, без My Resources.

у меня 10.14.6, могу протестировать.


Название: Re: Стартует "не оттуда"
Отправлено: Igors от Январь 28, 2020, 11:53
а, My Resources не в пакете приложения лежит, тогда понятно :)
Ну да, его еще др приложения юзают для видео и др

а юзер случайно не прямо из архива пытается приложение запустить? /private/var/folders/* — это скорее всего временная папка. Например, в нее мог извлечься только MyApp.app, без My Resources.
Нет, погуглил - этот фолдер типа "священной коровы", его удалять не моги

у меня 10.14.6, могу протестировать.
Не могу, проект коммерческий. Но за предложение спасибо

Да, и забыл сказать - когда юзер запускает из Terminal - все норм


Название: Re: Стартует "не оттуда"
Отправлено: kambala от Январь 28, 2020, 12:23
а юзер случайно не прямо из архива пытается приложение запустить? /private/var/folders/* — это скорее всего временная папка. Например, в нее мог извлечься только MyApp.app, без My Resources.
Нет, погуглил - этот фолдер типа "священной коровы", его удалять не моги
действительно, я перепутал — временное хранилище на /var/folders/ начинается, без /private

приложение подписано? если нет, может GateKeeper виноват?

если из терминала запустить через
Код:
open /path/to/MyApp.app
тоже не работает?


Название: Re: Стартует "не оттуда"
Отправлено: Igors от Январь 29, 2020, 16:23
приложение подписано? если нет, может GateKeeper виноват?
Еще нет (занимаются товарищи). Да, скорее всего там собака и порылась.  Вот намек (https://support.mokastudio.com/support/solutions/articles/6000184826-macos-sierra-10-12-app-translocation-gatekeeper-path-randomization)

Юзер говорит: сначала запустите на своей машине, потом зипуйте. Откуда он это взял - хз, ну ладно, бум так "пробывать"

Совсем забросил ОС, чувствую себя несведущим  :)


Название: Re: Стартует "не оттуда"
Отправлено: Igors от Февраль 01, 2020, 08:53
Так, ну предложение юзера не оправдалось - все равно у него не стартует. А вот фокус с xattr (ссылка выше) работает. Конечно только у него, у меня bundle (app) никакого xattr не имеет. Наверно OSX ставит этот атрибут когда вытаскивает из zip'a.  

Может сделать маленькое приложение чтобы избавить от возни с terminal'ом? Тогда вопрос - а как в командную строку передать это злосчастное "sudo"?


Название: Re: Стартует "не оттуда"
Отправлено: kambala от Февраль 01, 2020, 20:37
да, это GateKeeper добавляет к «непроверенным» приложениям.

можно не в командную строку добавлять sudo, а просто запросить повышение привилегий для маленького приложения у системы.


Название: Re: Стартует "не оттуда"
Отправлено: Igors от Февраль 03, 2020, 14:00
можно не в командную строку добавлять sudo, а просто запросить повышение привилегий для маленького приложения у системы.
Расскажите как (для меня командная строка всегда была врагом народа :))

Передача sudo - актуально, как я понял, повышение все равно через Terminal, и объяснять каждому (а они любят что-то набирать еще меньше) - запарюсь


Название: Re: Стартует "не оттуда"
Отправлено: kambala от Февраль 03, 2020, 16:57
нет, зачем именно через командную строку? можно же выполнить любую операцию и через какой-нибудь NSTask, а то и вовсе вызвать напрямую removexattr() (или какая там функция подходит).

повышение привилегий: https://developer.apple.com/library/archive/documentation/Security/Conceptual/authorization_concepts/02authconcepts/authconcepts.html (сам такой код не писал)

или даже еще проще: просто создать скрипт, который все сам выполнит, и дать ему расширение .command (можно мышкой дважды кликнуть для запуска). что-то типа такого:
Код
Bash
#!/usr/bin/env bash
 
scriptDir=$(dirname "$0")
myApp="$scriptDir/MyApp.app" # приложение лежит в той же папке, что и скрипт
sudo xattr -r -d com.apple.quarantine "$myApp"
open "$myApp"
юзеру только надо будет ввести свой пароль и всё.


Название: Re: Стартует "не оттуда"
Отправлено: Igors от Февраль 05, 2020, 10:28
или даже еще проще: просто создать скрипт, который все сам выполнит, и дать ему расширение .command (можно мышкой дважды кликнуть для запуска). что-то типа такого:
Код
Bash
#!/usr/bin/env bash
 
scriptDir=$(dirname "$0")
myApp="$scriptDir/MyApp.app" # приложение лежит в той же папке, что и скрипт
sudo xattr -r -d com.apple.quarantine "$myApp"
open "$myApp"
юзеру только надо будет ввести свой пароль и всё.
Да, привлекательно. А можно здесь как-нибудь пискнуть типа "file not found" (а то хз сработало или нет). Спвсибо


Название: Re: Стартует "не оттуда"
Отправлено: kambala от Февраль 05, 2020, 11:35
так он и сам пискнет:
Код:
$ xattr -r -d com.apple.quarantine ./asd
xattr: No such file: ./asd
ну или проверить руками есть ли приложение:
Код
Bash
#!/usr/bin/env bash
 
scriptDir=$(dirname "$0")
myApp="$scriptDir/MyApp.app" # приложение лежит в той же папке, что и скрипт
if [ ! -d "$myApp" ]; then
 echo "app not found at $myApp"
 exit 1
fi
sudo xattr -r -d com.apple.quarantine "$myApp"
open "$myApp"


Название: Re: Стартует "не оттуда"
Отправлено: Igors от Февраль 06, 2020, 08:56
Спасибо, бум пробывать