Пакет приложений Mac OS X падает при загрузке и запуске, но работает нормально в терминале или при изменении Info.plist - PullRequest
0 голосов
/ 17 сентября 2018

Сборка и запуск пакета приложений Mac OS X работает нормально.Даже копирование изображения .dmg на другой компьютер Mac с помощью rsync и запуск на этом «чистом» MacBook работает нормально.Загрузка файла .dmg на веб-сайт, загрузка его и попытка запустить программу активирует меру безопасности, предупреждающую пользователя о том, что

приложение не может быть открыто, так как личность разработчика не может быть подтверждена,Ваши настройки безопасности позволяют устанавливать только приложения из App Store и идентифицированных разработчиков.«TestApp» находится на образе диска «TestApp.dmg».Firefox скачал этот образ диска сегодня в 10:16 с somewebsite.com

Пока это нормальное поведение, но при попытке открыть приложение с помощью вкладки «Безопасность и конфиденциальность» в системных настройках, оно отображаетто же сообщение, после которого программа сразу вылетает.Выдержка из аварийного дампа:

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Signal:    Segmentation fault: 11
Termination Reason:    Namespace SIGNAL, Code 0xb
Terminating Process:   exc handler [0]

VM Regions Near 0:
--> 
    __TEXT                 0000000106e23000-00000001072a7000 [ 4624K] r-x/rwx SM=COW  bV [/var/folders/9c/_5lswjs174q6xxbf9qs6gqcc0000gn/T/AppTranslocation/659F14AE-09F4-4A1A-84A8-DA6BE86F6F4E/d/TestApp.app/Contents/MacOS/TestApp]

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_c.dylib               0x00007fff6ddd5232 strlen + 18
1   Test.app                        0x0000000106e52a45 std::__1::char_traits<char>::length(char const*) + 21
2   Test.app                        0x0000000106e39d5c std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) + 44
3   Test.app                        0x0000000106e7ae04 main + 1492
4   libdyld.dylib                   0x00007fff6dd85015 start + 1

Хотя запуск исполняемого файла внутри загруженного пакета приложений непосредственно в терминале работает нормально.Когда я изменяю значение ключа CFBundleExecutable в файле TestApp.app/Contents/Info.plist, он неожиданно работает нормально.

Это заставляет меня поверить, что что-то не так с кодировкой, хотя я совсем не знаком с разработкой под Mac OS X.

Проверка загруженного, но не измененного пакета приложений с помощью codesign -dvvvv testApp.app даетследующий результат Info.plist entries=20.После изменения Info.plist в той же строке написано Info.plist=not bound

Дополнительные сведения: я хотел бы избежать использования xcode, поскольку в Windows и Linux должна использоваться одна и та же процедура сборки.Я создал программу на C ++ с использованием CMAKE и создал пакет приложений примерно так:

add_executable( TestApp MACOSX_BUNDLE ${SOURCES} ${MOC_SRCS} )
target_link_libraries( TestApp ${LIBRARIES} ) 
set_target_properties(TestApp PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "TestApp")

Это зависит от некоторых внешних библиотек, таких как QT, OpenCV, boost, с которыми динамически связан исполняемый файл.Я скопировал все необходимые файлы dylib в каталог TestApp.app/Contents/Frameworks и изменил пути в исполняемом файле и библиотеках, используя 'otool' и 'install_name_tool'.Следующий вручную созданный файл Info.plist затем копируется в TestApp.app/Content/Info.plist.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>BuildMachineOSBuild</key>
    <string>17D102</string>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleExecutable</key>
    <string>TestApp</string>
    <key>CFBundleIdentifier</key>
    <string>abc.testapp</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>4.0</string>
    <key>CFBundleName</key>
    <string>TestApp</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleSupportedPlatforms</key>
    <array>
        <string>MacOSX</string>
    </array>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>DTCompiler</key>
    <string>com.apple.compilers.llvm.clang.1_0</string>
    <key>DTPlatformBuild</key>
    <string>9F2000</string>
    <key>DTPlatformVersion</key>
    <string>GM</string>
    <key>DTSDKBuild</key>
    <string>17E189</string>
    <key>DTSDKName</key>
    <string>macosx10.13</string>
    <key>DTXcode</key>
    <string>0941</string>
    <key>DTXcodeBuild</key>
    <string>9F2000</string>
    <key>LSMinimumSystemVersion</key>
    <string>10.13</string>
    <key>NSMainNibFile</key>
    <string>MainMenu</string>
    <key>NSPrincipalClass</key>
    <string>NSApplication</string>
</dict>
</plist>

Затем я использую '/local/Qt/5.10.1/clang_64/bin/macdeployqt TestApp.app -codesign = "Разработчик Mac: my@account.com (123456)" -dmg -verbose = 3 ', чтобы скопировать файлы QT в пакет, изменить пути выполнения, кодировать все библиотеки и сам пакет и создать dmg.Запуск этой программы работает на macbook, на котором она разработана, она работает на других маках, когда dmg передается с помощью rsync.Это не работает при загрузке и загрузке с веб-сайта.Удивительно, но адаптация файла Info.plist пакета загруженного приложения или запуск исполняемого файла непосредственно в терминале работает.

1 Ответ

0 голосов
/ 18 сентября 2018

Не использование моего созданного вручную Info.plist, но использование файла, созданного macdeployqt, решило проблему.Все еще не совсем удовлетворен, так как я не понимаю, почему использование неправильного Info.plist вызовет segfault, но, по крайней мере, это решено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...