Mac .app package backwards compatibility error: "You can't use this version of the application "[my app name]" with this version of OS X."

Mac .app package backwards compatibility error: "You can't use this version of the application "[my app name]" with this version of OS X."

我正在开发一款将通过 Steam 发布和分发的跨平台游戏,但遇到 Mac 版本问题。一切都是用 C++ 编写的,并使用 CMake 生成的项目文件在 El Capitan 上使用 Xcode 构建,其中包含一些小的修改。构建完成后,我使用自己的构建脚本将 .app 包放在一起,生成目录结构,添加图标文件和二进制文件,以及我编写的 Info.plist 文件我自己遵循我能找到的关于哪些元素是必要的文档。

问题在于向后兼容性。当我尝试在 Mac 运行ning Yosemite 上启动游戏 .app 时,我收到此错误消息:

You can't use this version of the application "[my app name]" with this version of OS X. You have OS X 10.10.5. The application requires OS X 10.11 or later.

问题是,在 Xcode 中我将构建目标指定为 OS X 10.7,所以我很困惑为什么会出现此错误。我什至可以进入 Finder 中的包,导航到实际的游戏二进制文件,然后 运行 它没有问题。当我双击 .app 文件(其图标显示带斜杠的圆圈,表明我可能在 Info.plists 或包配置中做错了什么)时,它只会失败并显示此错误消息。 运行在 El Capitan 上运行时一切正常。

我也尝试过适当地设置 LSMinimumSystemVersion,但这并不能解决问题。

这是我的 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>CFBundleExecutable</key>
    <string>Contents/MacOS/[binary name]</string>
    <key>CFBundleDisplayName</key>
    <string>[game title]</string>
    <key>CFBundleIconFile</key>
    <string>[icon file]</string>
</dict>
</plist>

我想 Info.plist 中缺少某些内容,但 Apple 的有关必需密钥的文档对于弄清楚可能是什么没有帮助。

如果您需要更多信息来解决这个问题,请告诉我,非常感谢您的帮助!

所以问题似乎是 clang 在输出二进制文件的数据部分设置了最低 mac 版本。二进制文件在 运行 时直接执行而不是通过 .app 执行的原因是,当 运行 与 .app 一起执行时,它实际上是 LaunchServices 执行二进制文件,它会检查嵌入到二进制文件中的版本号。这是 clang 的汇编输出示例:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 12
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    xorl    %eax, %eax
    movl    [=10=], -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    popq    %rbp
    retq
    .cfi_endproc


.subsections_via_symbols

右上角“.macosx_version_min”就是问题所在。要更改此嵌入式版本号,您只需设置一个编译器标志:

$ gcc -mmacosx-version-min=10.7 -S -o main.S main.c

现在,当我们查看输出程序集时:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 7
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    xorl    %eax, %eax
    movl    [=12=], -4(%rbp)
    movl    %edi, -8(%rbp)
    movq    %rsi, -16(%rbp)
    popq    %rbp
    retq
    .cfi_endproc


.subsections_via_symbols

繁荣,版本号固定。

仅供参考,因为我自己 运行 关注这个问题:

确定哪个 -mmacosx-version-min 标志 真正被 使用 Xcode,在 Xcode 中构建项目,然后切换到构建报告航海家。单击上次构建的报告和任何条目 "Compile xxx.m",然后展开条目。

您将在此处找到用于构建该文件的完整命令以及所有命令行标志。按 Cmd-F 并搜索 "mmacosx-version-min".

我的解决方法是在项目级别构建设置中明确指定部署目标。其值为"default",使用当前系统版本

如果您使用框架,它们也可能使用了错误的部署目标。同样的解决方案对我有用。