我已经为 M1 Mac 制作了 Scilab 的本机构建(参见 https://www.utc.fr/~mottelet/scilab_for_macOS.html),该应用程序似乎在通过双击其图标启动时触发 Rosetta2,如下所示结果,其整体环境被错误地报告为 x86_64 而不是 arm64。例如,您可以从 Scilab 命令行启动 shell 命令并获取输出。例如
uname -m
产量
--> unix_g("uname -m")
ans =
"x86_64
当 Scilab 从其图标启动或通过终端使用
open
启动时。
但是,当应用程序主脚本直接从终端启动时,即在此处键入
me@mac-M1 ~ % /Applications/scilab-branch-6.1.app/Contents/MacOS/scilab
Scilab 中的相同 unix 命令会产生预期结果,因为该应用程序是针对 arm64 架构编译的:
--> unix_g("uname -m")
ans =
"arm64"
2021 年 1 月 6 日更新:
运行应用程序始终调用主
scilab
脚本(稍后调用实际的 scilab-bin
本机二进制文件)。双击应用程序后,通过 ps
获得的进程列表会产生
501 643 ?? 0:00.35 /bin/sh /Users/mottelet/Desktop/scilab-branch-6.1.app/Contents/MacOS/scilab
501 708 ?? 0:04.23 scilab-bin
正如您所猜测的,shell 的架构是错误的。我尝试过使用
<key>LSRequiresNativeExecution</key>
<true/>
在
Info.plist
但它不会改变任何东西。
这个问题如何调试?提供一个更紧凑的例子并不容易。如果读者中的一些专家可以帮助我,您只需下载 Scilab arm64 版本(请参阅上面的链接)并从 dmg 存档(经过 Apple 公证)获取该应用程序。首次运行时,Scilab 将下载本机 Java 8 JRE。感谢您的帮助和见解!
S.
我终于找到了这个解释@https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary:
如果应用程序不包含可执行二进制文件,系统可能会在 Rosetta 翻译下运行它,作为预防措施,防止潜在的运行时问题。例如,系统在 Rosetta 翻译下运行仅脚本应用程序。如果您验证您的应用程序可以在 Apple 芯片和基于 Intel 的 Mac 计算机上正确运行,请将 LSArchitecturePriority 键添加到应用程序的 Info.plist 文件中,并首先列出 arm64 架构。
但是,在 Info.plist 中添加 LSRequiresNativeExecution 或 LSArchitecturePriority 不会改变任何内容。我以为我里面出了问题,但即使有这个最小的属性列表
<?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>LSArchitecturePriority</key>
<array>
<string>arm64</string>
</array>
<key>LSRequiresNativeExecution</key>
<true/>
<key>CFBundleExecutable</key>
<string>scilab</string>
</dict>
</plist>
应用程序在 Rosetta 下启动。
与问题相关,您还可以使用
arch
和 ARCHPREFERENCE
设置 arch 使用的“优先级列表”。例如:
# launch with arm64 if possible, or fall back to x86_64
ARCHPREFERENCE=arm64,x86_64 arch /Applications/scilab-branch-6.1.app/Contents/MacOS/scilab
文档:https://www.unix.com/man-page/osx/1/arch/#~:~ARCHPREFERENCE