什么是“非法指令:4”错误,为什么“-mmacosx-version-min = 10.x”修复它?

问题描述 投票:57回答:7

当这些二进制文件在Mac OS X 10.7.x(“Lion”)和早期版本下运行时,我在Mac OS X 10.8.2(“Mountain Lion”)下使用GCC 4.7.2编译的二进制文件得到Illegal Instruction: 4错误。二进制文件在Mac OS X 10.8.x下正常工作。

我将-mmacosx-version-min=10.5添加到我的编译标志中,这似乎有助于解决10.5.x,10.6.x和10.7.x客户端的问题,无论问题是什么。

哪来得到我的问题:

  • 什么是Illegal Instruction: 4错误?
  • 为什么-mmacosx-version-min=10.x10.x和更大的客户端修复了这个特定的错误?

我想将这个修复程序应用到我的makefile中,但是在我触发之前想知道它是做什么的。 (我会有更大的二进制文件吗?我还有64位二进制文​​件吗?我应该知道这种方法有什么问题吗?意想不到的副作用?等等)

macos gcc osx-lion osx-mountain-lion osx-leopard
7个回答
35
投票

来自Apple Developer Forum(需要帐户):

“编译器和链接器能够使用功能并执行不适用于旧操作系统版本的优化.-mmacosx-version-min告诉工具您需要使用哪些操作系统版本,因此这些工具可以禁用不在这些操作系统版本上运行的优化如果您需要在较旧的OS版本上运行,则必须使用此标志。

-mmacosx-version-min的缺点是应用程序的性能在较新的操作系统版本上可能会更差,如果它不需要向后兼容它可能会更糟。在大多数情况下,差异很小。”


18
投票

“非法指令”消息只是告诉您,您的二进制文件包含指示您尝试在其下运行它们的操作系统版本不明白。我不能给你4的确切含义,但我希望这是Apple内部的。

否则看看这些......它们有点旧,但可能会告诉你你需要知道什么

How does 64 bit code work on OS-X 10.5? what does macosx-version-min imply?


3
投票

我有意识地将这个答案写在一个老问题with this上,因为其他答案对我没有帮助。

我在编译它的同一系统上运行二进制文件时得到了Illegal Instruction: 4,所以-mmacosx-version-min没有帮助。

我在Mac OS X 10.11上的代码块16中使用了gcc。

但是,关闭所有代码块的编译器标志以进行优化。所以看看代码块设置的所有标志(右键单击项目 - >“构建属性”)并关闭所有你确定不需要的标志,特别是-s-Oflags进行优化。这样做对我来说。


2
投票

我发现我的问题不合适 if (leaf = NULL) {...} 应该在哪里 if (leaf == NULL){...}

检查那些编译器警告!


2
投票

尝试使用Xcode 10构建时出现此错误。它似乎是Swift编译器中的错误。与Whole Module Optimization建立,解决了问题:https://forums.swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118

这不是一个理想的解决方案,我将继续使用Xcode 9.4.1,直到此问题得到解决。


0
投票

我最近得到了这个错误。我用-O3编译了二进制文件。谷歌告诉我,这意味着“非法操作码”,这对我来说似乎很可疑。然后我关闭了所有优化并重新开始。现在错误转换为段错误。因此,通过设置-g并运行valgrind,我跟踪了源并修复了它。重新启用所有优化表明没有进一步出现非法指令4。

显然,优化错误代码会产生奇怪的结果。


0
投票

在我的情况下,我在重载时得到了这个

ostream & operator << (ostream &out, const MyClass &obj)

并忘记返回out。在其他系统中,这只会生成警告,但在macos上它也会产生错误(尽管它似乎正确打印)。

通过添加正确的返回值来解决错误。在我的情况下,添加-mmacosx-version-min标志没有任何效果。

© www.soinside.com 2019 - 2024. All rights reserved.