我在Mac OS X 10.8.2(“Mountain Lion”)下使用GCC 4.7.2编译的二进制文件出现Illegal Instruction: 4
错误,当这些二进制文件在Mac OS X 10.7.x(“Lion”)下运行时和早期版本。二进制文件在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位二进制文件吗?我应该知道这种方法有什么问题吗?意想不到的副作用?等等。)
答案 0 :(得分:35)
来自Apple Developer Forum(需要帐户):
“编译器和链接器能够使用功能并执行不适用于旧操作系统版本的优化。
-mmacosx-version-min
告诉工具您需要使用哪些操作系统版本,因此这些工具可以禁用赢得的优化运行在那些操作系统版本上。如果你需要在较旧的操作系统版本上运行,那么你必须使用这个标志。“
-mmacosx-version-min
的缺点是应用程序的性能在较新的操作系统版本上可能会更差,如果它不需要向后兼容它可能会更糟。在大多数情况下,差异很小。”< / p>
答案 1 :(得分:18)
“非法指令”消息只是告诉您,您的二进制文件包含指示您尝试在其下运行它们的操作系统版本不明白。我不能给你4
的确切含义,但我希望这是Apple内部的。
否则看看这些......它们有点旧,但可能会告诉你需要知道什么
How does 64 bit code work on OS-X 10.5?
what does macosx-version-min imply?
答案 2 :(得分:3)
我有意识地将这个答案写在一个旧问题with this上,因为其他答案并没有帮助我。
我在编译它的同一系统上运行二进制文件时得到了Illegal Instruction: 4
,因此-mmacosx-version-min
没有帮助。
我在Mac OS X 10.11上的代码块16中使用了gcc。
然而,关闭所有代码块&#39;优化的编译器标志工作。所以看看代码块设置的所有标志(右键单击项目 - &gt;&#34;构建属性&#34;)并关闭所有你不确定不需要的标志,尤其是{{1用于优化的-s
标志。这样做对我来说。
答案 3 :(得分:2)
我发现我的问题是不正确的
if (leaf = NULL) {...}
应该在哪里
if (leaf == NULL){...}
检查那些编译器警告!
答案 4 :(得分: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。
答案 5 :(得分:0)
我最近遇到了这个错误。我用-O3编译了二进制文件。谷歌告诉我,这意味着&#34;非法操作码&#34;,这对我来说似乎很可疑。然后我关闭了所有优化并重新开始。现在错误转换为段错误。因此,通过设置-g并运行valgrind,我跟踪了源并修复了它。重新启用所有优化表明没有进一步出现非法指令4。
显然,优化错误的代码会产生奇怪的结果。
答案 6 :(得分:0)
就我而言,我在重载时得到了
ostream & operator << (ostream &out, const MyClass &obj)
,却忘记返回out
。在其他系统中,这只会生成一个警告,但是在macOS上,它还会生成一个错误(尽管看起来可以正确打印)。
通过添加正确的返回值解决了错误。就我而言,添加-mmacosx-version-min
标志无效。