Mac os x app bundle 在下载并运行时崩溃,但在终端或更改 Info.plist 时运行良好
Mac os x app bundle crashes when downloaded and run, but runs fine in the terminal or when changing Info.plist
构建和运行Mac OS X应用程序包工作正常。即使使用 rsync 将.dmg映像复制到另一台 Mac 并在此"原始"MacBook 上运行也可以正常工作。将.dmg上传到网站,下载并尝试运行程序,会激活安全措施,警告用户
无法打开应用程序,因为无法确认开发人员的身份。您的安全偏好设置仅允许安装来自 App Store 和已识别开发者的应用。 "TestApp"位于磁盘映像"TestApp.dmg"上。火狐下载了这个 磁盘映像今天 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
不过,直接在终端中运行下载的应用程序包中的可执行文件工作正常。 当我更改TestApp.app/Contents/Info.plist
文件中CFBundleExecutable
键的值时,它令人惊讶地工作正常。
这让我相信协同设计有问题,尽管我对在Mac OS X上进行开发完全不熟悉。
使用codesign -dvvvv testApp.app
检查已下载但未更改的应用程序捆绑包会得到以下结果Info.plist entries=20
。更改 Info.plist 后,同一行显示Info.plist=not bound
更多背景: 我想避免使用xcode,因为在Windows和Linux上应该使用相同的构建过程。 我使用 CMAKE 构建了一个C++程序,并创建了一个应用程序包,如下所示:
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 Developer: my@account.com (123456(" -dmg -verbose=3' 将 QT 的文件复制到捆绑包中,更改运行路径,共同设计所有库和捆绑包本身并创建一个 dmg。 运行此程序适用于开发它的 macbook,当使用 rsync 传输 dmg 时,它可以在其他 Mac 上运行。上传到网站和从网站下载时它不起作用。令人惊讶的是,调整下载的应用程序包的 Info.plist 文件或直接在终端中运行可执行文件是有效的。
不使用我手动创建的Info.plist,而是使用macdeployqt生成的一个解决了这个问题。仍然不太满意,因为我不明白为什么使用错误的 Info.plist 会触发段错误,但至少它已经解决了。
- Mac os x app bundle 在下载并运行时崩溃,但在终端或更改 Info.plist 时运行良好
- 如何在 Plist coco2dx c++ 中更改值
- IS类型INFO自动更新了以前调用Destructor
- "char *pList"型
- 提升信息解析器在读取/写入 INFO 格式文件时删除所有注释
- 我如何允许向量传递到info(),capture(),warn()等,同时避免非法扩展std名称空间
- std :: getline(输入,d.info)不起作用
- 什么是log(info)和日志(错误)进行
- 访问冲突错误在 (而 (info[x] != ))
- C 解析二进制PLIST
- 通过Cocos2dx中的plist文件加载动画
- Electron-无日志消息由C++文件中的log(INFO)打印
- 如何在 WP 8.1 或 WP 8 中的本机C++中使用命名空间 - Microsoft.Phone.Info
- 使用 #define 和 clang 为 info.plist 创建版本号变体
- 使用 sysctl() 的 OSX 上的 info CPU
- 从 c++ 代码编辑 plist
- 波特迪奥和阿尔萨:"Cannot obtain info for CTL elem"
- Cocos2D X:如何检查plist文件是否存在密钥
- NSPropertyListSerialization propertyListWithData使用二进制plist失败
- 无法使用XCode从命令行目标读取plist文件