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

我得到Illegal Instruction: 4在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客户端的问题,无论这个问题是什么。

哪些得到我的问题(S):

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

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

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

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

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

“非法指令”信息只是告诉你,你的二进制文件包含你正试图运行它们的操作系统的版本不明白的说明。 我不能给你4的确切含义,但我认为这是苹果的内在。

否则看看这些…他们有点老,但可能告诉你你需要知道什么

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

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

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

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

但是,closures所有代码块的编译器标志进行优化。 因此,查看所有标志代码块设置(右键单击项目 – >“生成属性”),并closures所有你确定你不需要的标志,尤其是-s-O标志进行优化。 这是为我做的。

我发现我的问题是不正确的
if (leaf = NULL) {...}
它应该在哪里
if (leaf == NULL){...}

检查这些编译器警告!