共用方式為


/kernel (建立核心模式二進位檔)

建立可在 Windows 核心中執行的二進位檔。 目前專案中的程式代碼會使用一組簡化C++語言功能來編譯和連結,這些功能是核心模式中執行之程序代碼特有的。

語法

/kernel

備註

/kernel指定 選項會告知編譯程式和連結器,以仲裁核心模式中允許的語言功能,並確定您有足夠的表達能力,以避免運行時間不穩定,而核心模式C++是唯一的。 這樣做的方式是禁止使用C++核心模式干擾的語言功能。 編譯程式會產生C++語言功能的警告,這些功能可能會造成干擾,但無法停用。

此選項 /kernel 同時套用至建置的編譯程式和連結器階段,並且設定在專案層級。 /kernel傳遞 參數,以指示編譯程式在鏈接之後產生的二進位檔應該載入到 Windows 核心中。 編譯程式會將C++語言功能的範圍縮小到與核心相容的子集。

下表列出指定時 /kernel 編譯程序行為的變更。

行為類型 /kernel 行為
C++例外狀況處理 Disabled. 和 try 關鍵詞的所有實例throw都會發出編譯程式錯誤(例外狀況規格throw()除外)。 除了 之外,/EH-沒有任何/EH選項與/kernel相容。
RTTI Disabled. 除非靜態使用 ,否則 dynamic_casttypeid 關鍵詞的所有實例dynamic_cast都會發出編譯程序錯誤。
newdelete 您必須明確定義 new()delete() 運算符。 編譯程式和運行時間不提供預設定義。

當您使用 /kernel 選項時,允許自定義呼叫慣例、/GS建置選項和所有優化。 內嵌基本上不會受到 /kernel的影響,編譯程式所接受的語意相同。 如果您想要確定 __forceinline 採用內嵌限定符,您必須確定已啟用警告 C4714 ,以便您知道特定 __forceinline 函式何時未內嵌。

沒有 #pragma 相當於控制這個選項。

當編譯程式傳遞 /kernel 參數時,它會預先定義名為 _KERNEL_MODE 且值為 1預處理器巨集。 您可以使用這個巨集,根據執行環境處於使用者模式或核心模式,有條件地編譯程序代碼。 例如,下列程式代碼會 MyNonPagedClass 指定類別在針對核心模式執行編譯時,應該位於不可分頁的記憶體區段中。

#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

當目標架構和 /arch 選項搭配 /kernel使用時,下列部分組合會產生錯誤:

  • /arch:SSEx86 不支援、 /arch:SSE2/arch:AVX/arch:AVX2/arch:AVX512 。 只有在 /arch:IA32 x86 上才支援 /kernel

  • /arch:AVXx64 不支援、 /arch:AVX2/arch:AVX512 /kernel

使用 建置 /kernel 也會傳遞 /kernel 至連結器。 以下是選項如何影響連結器行為:

  • 累加連結已停用。 如果您新增 /incremental 至命令列,連結器就會發出這個嚴重錯誤:

    嚴重錯誤LNK1295:'/INCREMENTAL' 與 '/KERNEL' 規格不相容;沒有 『/INCREMENTAL』 的連結

  • 鏈接器會檢查每個物件檔案(或靜態庫包含的封存成員),以查看它是否可以使用 /kernel 選項進行編譯,但不是。 如果有任何實例符合此準則,連結器仍會成功連結,但可能會發出警告,如下表所示。

    Command /kernel obj non-/kernel obj、MASM obj 或 cvtres obj 混合 /kernel 與非/kernel objs
    link /kernel Yes Yes 是,警告LNK4257
    link Yes .是 Yes

    LNK4257連結物件未使用 /KERNEL 編譯;映像可能無法執行

選項 /kernel/driver 選項會獨立運作。 它們對彼此沒有任何影響。

在 Visual Studio 中設定 /kernel 編譯程序選項

  1. 開啟專案的 [ 屬性頁 ] 對話框。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。

  3. 在 [ 其他選項] 方塊中,新增 /kernel。 選擇 [確定] 或 [套用] 以儲存變更。

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法