首页 文章

Mac OS x app捆绑包在下载和运行时崩溃,但在终端或更改Info.plist时运行正常

提问于
浏览
1

构建和运行Mac OS X应用程序包工作正常 . 即使使用rsync将.dmg图像复制到另一个mac并在这个'处女'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

直接在终端中运行下载的应用程序包中的可执行文件可以正常工作 . 当我在 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文件或直接在终端中运行可执行文件 .

1 回答

  • 0

    不使用我手动创建的Info.plist,但使用macdeployqt生成的Info.plist解决了这个问题 . 仍然不太满意,因为我不明白为什么使用错误的Info.plist会触发段错误,但至少它已经解决了 .

相关问题