首页 > 解决方案 > 应用程序根据启动方法报告不同的架构

问题描述

我已经为 M1 Macs 制作了 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

由于应用程序已针对 arm64 架构编译,因此 Scilab 中的相同 unix 命令会产生预期结果:

--> unix_g("uname -m")
 ans  =

  "arm64"

2021 年 1 月 6 日更新:

运行应用程序总是调用主scilab脚本(稍后调用实际的scilab-bin本机二进制文件)。当app被双击时yield得到的进程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。

标签: macosscilabapple-m1rosetta-2

解决方案


我终于找到了这个解释@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 下启动。


推荐阅读