83

Illegal Instruction: 4Mac OS X 10.8.2( "Mountain Lion")でGCC4.7.2をコンパイルしたバイナリをMacOSX 10.7.x( "Lion")以前のバージョンで実行すると、エラーが発生します。バイナリはMacOSX10.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 Developer Forumから(アカウントが必要です):

「コンパイラとリンカは、古いOSバージョンでは機能しない機能を使用して最適化を実行できます。-mmacosx-version-min使用する必要のあるOSバージョンをツールに通知するため、ツールはそれらのOSバージョンで実行されない最適化を無効にできます。古いバージョンのOSで実行する必要がある場合は、このフラグを使用する必要があります。

「欠点-mmacosx-version-minは、新しいOSバージョンでは、下位互換性が必要ない場合よりもアプリのパフォーマンスが低下する可能性があることです。ほとんどの場合、違いはわずかです。」

于 2013-01-11T20:12:53.617 に答える
25

「不正な命令」メッセージは、バイナリに、実行しようとしているOSのバージョンが理解できない命令が含まれていることを示しているだけです。正確な意味をお伝えすることはできませんが、4それはAppleの内部にあると思います。

それ以外の場合はこれらを見てください...それらは少し古いですが、おそらくあなたが知る必要があることを教えてください

64ビットコードはOS-X10.5でどのように機能しますか?
macosx-version-minは何を意味しますか?

于 2013-01-10T23:18:55.783 に答える
5

他の答えは私を助けなかったので、私はこれを念頭に置いて古い質問に対するこの答えを意識的に書いています。

Illegal Instruction: 4コンパイルしたのと同じシステムでバイナリを実行しているときに取得したので、-mmacosx-version-min役に立ちませんでした。

Mac OSX10.11のコードブロック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コンパイラのバグのようです。onでビルドするとWhole Module Optimization、問題が解決します:https ://forums.swift.org/t/illegal-instruction-4-when-trying-to-compile-project/16118

これは理想的な解決策ではありません。この問題が解決するまで、Xcode9.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 に答える