/kernel (Create Kernel Mode Binary)
Windows のカーネルで実行できる binary を作成します。
/kernel[-]
引数
/kernel
現在のプロジェクトのコードがコンパイルされ、一連でコードに固有な C++ 言語規則を使用してリンク カーネル モードで実行されます。/kernel-
現在のプロジェクトのコードは、それをコンパイルするコードに固有の C++ 言語の規則を使用しないでリンク カーネル モードで実行されます。
解説
同等の #pragma がこのオプションを設定すると、ありません。
/kernel のオプションを指定すると、コンパイラとリンカーがどの言語機能がカーネル モードで許可されていると、カーネル モード C++ に固有のランタイムの不安定を回避するための十分な表現力があることを確認するか仲裁するように指示します。これは、カーネル モードや危険性のある実行されますが、無効にできません C++ 言語機能に警告を提供することによって、区分のある C++ 言語機能の使用を禁止します。
/kernel のオプションでは、ビルドのコンパイラおよびリンカー フェーズの両方に適用し、プロジェクト レベルで設定されます。リンクした後で、binary 結果が Windows のカーネルにあることをコンパイラに示すように /kernel スイッチを渡します。コンパイラは、カーネルと互換性のあるサブセットに C++ 言語機能の範囲を限定できます。
次の表は /kernel を指定すると、コンパイラの動作の変更の一覧を示します。
動作の型 |
/kernel の動作 |
---|---|
C++ 例外処理 |
無効。throw と try のキーワードのすべてのインスタンスは、コンパイラのエラーを出力します (例外指定 throw()を除く)。/EH のオプションは /EH-を除く /kernelと互換性のあるものではありません。 |
RTTI |
無効。dynamic_cast と typeid のキーワードのすべてのインスタンスは dynamic_cast が静的に使用しない場合、コンパイラのエラーを出力します。 |
new および delete |
明示的に new() または delete() の演算子を定義します; コンパイラ、ランタイムは既定の定義を確認しません。 |
/kernel のオプションを使用すると、規則を /GS のビルド オプション呼び出すカスタム コントロールおよびすべての最適化が割り当てられます。インライン展開はコンパイラによって有効にして同じセマンティクスは /kernelに、キーとして、影響しません。修飾子をインライン展開 __forceinline は、優先されることを確認する場合は、ドット __forceinline 関数がいつインラインかわかるように C4714 に警告を有効になっていることを確認してください。
コンパイラが /kernel スイッチに渡される場合、_KERNEL_MODE という値を持つ 1プリプロセッサ マクロを定義します。実行環境がユーザー モードまたはカーネル モードかどうかを条件に基づいてコードのコンパイルに利用できます。たとえば、次のコードは、カーネル モードの実行用にコンパイルする場合クラスがページングできないメモリ セグメントに必要であることを指定します。
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
また、ターゲット アーキテクチャと /arch オプションを次の /kernelと組み合わせて使用するとエラーを生成します:
/arch:{SSE|SSE2|AVX} は、x86 ではサポートされていません。x86 のみ /arch:IA32 の /kernel でサポートされます。
/arch:AVX は、x64 /kernel でサポートされません。
/kernel と、ビルド /kernel をリンカーに渡します。これは、リンカーの動作に与える影響 Her:
インクリメンタル リンクは無効になります。コマンド ラインに /incremental を追加した場合、リンカーはこの致命的なエラーを出力します:
LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'
リンカーは、コンパイルも、検査します。各オブジェクト ファイル (または /kernel のオプションを使用して、そうでないかどうかを確認するには、スタティック ライブラリのアーカイブのメンバーを含む)。インスタンスには、この条件を満たしていれば、正常に、リンカーのリンクを次の表に示すように、警告を発行する場合があります。
/kernel の obj
/kernel- の obj、MASM の obj、または cvtresed
/kernel と /kernel- の objs の組み合わせ
リンク /kernel
○
○
○ LNK4257 の警告と
link
○
○
○
LNK4257 linking object not compiled with /KERNEL ; image may not run
/kernel のオプションと /driver のオプションは、他の影響は独立して動作しません。
Visual Studio の /kernel のコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダーを選択します。
[コマンド ライン] のプロパティ ページを選択します。
[追加のオプション] ボックスに、[/kernel] か /kernel-を追加します。