83

Illegal Instruction: 4当这些二进制文件在 Mac OS X 10.7.x(“Lion”)和更早版本下运行时,我在 Mac OS X 10.8.2(“Mountain Lion”)下使用 GCC 4.7.2 编译的二进制文件出错。二进制文件在 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.x上修复此特定错误?10.x

我想将此修复应用到我的 makefile,但想在扣动扳机之前知道它在做什么。(我会有更大的二进制文件吗?我还有 64 位二进制文​​件吗?我应该知道这种方法的陷阱吗?意外的副作用?等等。)

4

7 回答 7

43

来自Apple 开发者论坛(需要帐户):

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

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

于 2013-01-11T20:12:53.617 回答
25

“非法指令”消息只是告诉您,您的二进制文件包含您尝试运行它们的操作系统版本不理解的指令。我不能给你确切的意思,4但我希望这是苹果内部的。

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

64 位代码如何在 OS-X 10.5 上运行?
macosx-version-min 是什么意思?

于 2013-01-10T23:18:55.783 回答
5

考虑到这一点,我有意识地写了一个老问题的答案,因为其他答案对我没有帮助。

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

我在 Mac OS X 10.11 上的 Code Blocks 16 中使用 gcc。

但是,关闭所有代码块的编译器标志以进行优化是可行的。因此,查看代码块设置的所有标志(右键单击项目 ->“构建属性”)并关闭所有您确定不需要-s-O标志,尤其是优化标志。那是为我做的。

于 2016-07-06T07:45:39.197 回答
4

我发现我的问题不
if (leaf = NULL) {...}
应该出现在应该出现的地方
if (leaf == NULL){...}

检查那些编译器警告!

于 2017-07-07T04:29:50.140 回答
3

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

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

于 2018-10-05T20:25:53.980 回答
3

就我而言,我在超载时得到了这个

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

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

通过添加正确的返回值解决了错误。就我而言,添加-mmacosx-version-min标志没有效果。

于 2019-04-16T12:51:33.740 回答
1

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

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

于 2018-02-16T13:44:46.383 回答