在 M1 的 苹果电脑上配置开发环境时,很多教程会提示将XCode或Simulator设置为以rosetta的方式运行以解决编译时的问题。
一开始不是很理解,rosetta不是为了兼容老的应用,使编译为x86-64格式的老应用也能运行在M1的ARM cpu上而作的运行时转义吗?没搞明白设置应用为rosetta方式是什么意思,难道这个应用即可以按rosetta的方式运行,也可以按arm的原生的方式运行?那这个应用到底是x86格式的还是arm格式的?
后来发现可设置为rosetta方式的应用,是x86-64和arm64的二进制格式都有。如果不设为rosetta的方式的话,就直接运行应用包中的arm64格式的二进制文件了。设为rosetta的话,就以rosetta的方式运行应用包中的x86-64的二进制文件。
如果应用中只有x86-64或arm64格式中的一种,在打开应用的简介后,就不会出现rosetta选项了。因为系统没得选,是啥格式就按啥方式运行。
查看应用包中cpu格式的方式:
下面以系统自带的《词典》应用为例,右键词典.app,在弹出菜单上选中显示包内容:
打开的包中,Contents/MacOS/目录下是应用编译后的二进制文件:
打开终端,cd 到Contents/MacOS目录下:
cd /System/Applications/Dictionary.app/Contents/MacOS
可以将Finder中的MacOS文件夹拖到终端,就会在终端输入MacOS的路径了。
然后执行命令:lipo -info Dictionary
输出如下:
Architectures in the fat file: Dictionary are: x86_64 arm64e
所以看到系统的《字典》应用 包含了 x86_64 和 arm64e 两个架构。
再安装钉钉和微信和钉钉,同样的方式,可以看到微信是x86_64 arm64e
而钉钉只有x86_64,所以打开钉钉的简介后,就没有rosetta选项,而微信则有。
如下操作看钉钉支持的cpu 架构:
cd /Applications/DingTalk.app/Contents/MacOS
lipo -info DingTalk
输出为:
Non-fat file: DingTalk is architecture: x86_64