我正在开发一款跨平台的游戏,该游戏将通过Steam发布和分发,并且在Mac版本上遇到问题。一切都是用C ++编写的,并使用由CMake生成的项目文件在El Capitan上使用Xcode构建,包含一些小的修改。构建完成后,我使用自己的构建脚本将.app包放在一起,生成目录结构,添加图标文件和二进制文件,以及我自己编写的Info.plist文件。我可以找到哪些文件是必要的。
问题在于向后兼容性。当我尝试在运行Yosemite的Mac上启动游戏.app时,我收到以下错误消息:
您不能在此版本的OS X中使用此版本的应用程序“[我的应用程序名称]”。您有OS X 10.10.5。该应用程序需要OS X 10.11或更高版本。
问题是,在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的所需密钥文档在找出可能的内容方面没有帮助。
如果您需要更多信息来解决这个问题,请告诉我,非常感谢您的帮助!
答案 0 :(得分:7)
所以问题似乎是在输出二进制文件的数据部分设置最小的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 $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
popq %rbp
retq
.cfi_endproc
.subsections_via_symbols
在顶部&#34; .cosx_version_min&#34;是问题。要更改此嵌入式版本号,您只需设置编译器标志:
$ 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 $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
popq %rbp
retq
.cfi_endproc
.subsections_via_symbols
Boom,版本号已修复。
答案 1 :(得分:0)
当我自己遇到这个问题时,以供参考:
确定Xcode实际上使用了哪个-mmacosx-version-min
标志,在Xcode中构建项目,然后切换到“构建报告导航器”。单击报告的最新版本,然后单击任何条目“ Compile xxx.m”,然后展开该条目。
您将在此处找到用于构建该文件的完整命令以及所有命令行标志。按Cmd-F并搜索“ mmacosx-version-min”。
我的解决方法是在项目级别构建设置中明确指定部署目标。它的值是“ default”,它使用当前的系统版本。
如果使用框架,则这些框架也可能使用了错误的部署目标。相同的解决方案对我有用。