macos - 应用程序根据启动方法报告不同的架构
问题描述
我已经为 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。
解决方案
我终于找到了这个解释@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 下启动。
推荐阅读
- python - rqt_plot:PyQt4 和 PyQt5 包装相同的对象类
- android - 上传图像时在 google vm 中调用 python 脚本
- ios - 无法在捆绑包中加载 NIB - pod 中有自己的框架
- google-cloud-platform - -R 上传文件名中包含西班牙字符的文件夹会返回错误
- html - 如果 div 存在,body 标签的意义何在
- rest - 尝试从 Powershell 调用 GitHub RestApi 调用以创建 Git 树并获取“解析 JSON 的问题”
- python - 在 Python 中的 subprocess.Popen 中指定标准输出中的文本类型
- sql - 查询调整/重写,需要关于使用 join 而不是 in 的建议以及在需要时进行更正的建议
- redux-form - Redux Form FieldArray 解析和格式化
- mongodb - 检查实体是否存在于 mongo 中,SpringData 在多文档事务中抛出异常计数是不允许的