什么是“非法指令:4”错误?为什么“ -mmacosx-version-min = 10.x”可以解决该错误?


71

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.x10.x更大的客户群上解决此特定错误?

我想将此修复程序应用于我的makefile,但想知道在执行触发器之前它在做什么。(我会拥有更大的二进制文件吗?我还会有64位二进制文​​件吗?我应该了解这种方法的陷阱吗?意外的副作用?等等。)


雪豹的Mac OSX 10.6,请澄清/更正
铸造

3
缺少的返回值可能会导致出现“非法指令:4”。我昨天碰到这个。注意我的编译器警告使我走上了正确的道路。
rsp1984

1
我七年前问过这个问题,对不起,今天无法为您提供帮助。我确实记得曾尝试为较旧版本的Mac OS X分发二进制文件,尽管如今看来这似乎是一个傻瓜游戏。
亚历克斯·雷诺兹

Answers:


41

苹果开发者论坛(需要帐户):

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

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


1
放置此标志的位置在项目的构建设置中的“其他链接器标志”下-mmacosx-version-min=10.10
德米特里'17

22

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

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

64位代码如何在OS-X 10.5上工作?
macosx-version-min意味着什么?


谢谢; 这两个问题和相关的答案很有趣,在问之前我已经阅读了它们,但是我问这个问题是因为它们都没有特别解决此错误,其原因以及为什么使用此标志是一种解决方案。例如,在将其投入生产之前,我只是想确保我不会破坏另一组用户的利益,并且我不清楚是否有任何副作用。
Alex Reynolds

2
我建议您不要担心,这是系统设计师的意图。我今天遇到的程式设计风格元素引述了一个不错的报价……“试图使编译器不明智,这使使用一个编译器的许多目的无法实现”
铸造厂,2013年

@foundry这是一个古老的报价,我似乎认为即使在您撰写时也是如此。我同意,除非您正在为iOCCC编写代码!:)但是,是的,人们的确倾向于不希望处理警告等。如果我不想修复警告,为什么根本不启用警告,这总是让我感到困惑。如果它始终处于启用状态,而无法禁用它,则修复红代码并完成它。否则忽略它。但是警告是开发人员的朋友。我已经在编译的同一系统上看到了这个非法指令4,但是在Linux(在那里编译)下,它可以正常工作。
Pryftan

4

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

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

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

但是,关闭所有代码块的编译器标志以进行优化是可行的。因此,请查看所有设置了代码块的标志(右键单击Project->“ Build Properties”),然后关闭所有您确定不需要-s-O标志,尤其是用于优化的标志。对我来说就做到了。


1
我的CLI应用程序可以在其原始目录中正常运行,但是在移动时会出现此错误。必须是我的代码中的某些内容,提早退出应用程序并打印一个hello world效果很好。
Cristi Băluță 16/09/17

应当记住,尽管优化器可以发现错误,并且通过禁用它们可以掩盖错误。当然,某些代码确实不应该进行优化,以便谁知道?但是,即使您最终确定不值得修复该错误,还是可以找到该错误的来源,还是更好。
Pryftan

3

我发现我的问题本来
if (leaf = NULL) {...}
应该是不合适的
if (leaf == NULL){...}

检查那些编译器警告!


2
你知道那个时候开玩笑叫什么,=操作员?叶子是NULL吗?就是现在!'
Pryftan


3

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

忘了回来out。在其他系统中,这只会生成一个警告,但是在macOS上,它还会生成一个错误(尽管看起来可以正确打印)。

通过添加正确的返回值解决了该错误。以我为例,添加-mmacosx-version-min标志无效。


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.