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",使用当前系统版本
如果您使用框架,它们也可能使用了错误的部署目标。同样的解决方案对我有用。
我正在开发一款将通过 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",使用当前系统版本
如果您使用框架,它们也可能使用了错误的部署目标。同样的解决方案对我有用。