/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_cast 和 typeid 關鍵詞的所有實例dynamic_cast 都會發出編譯程序錯誤。 |
new 和 delete |
您必須明確定義 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:SSE
x86 不支援、/arch:SSE2
、/arch:AVX
、/arch:AVX2
和/arch:AVX512
。 只有在/arch:IA32
x86 上才支援/kernel
。/arch:AVX
x64 不支援、/arch:AVX2
與/arch:AVX512
/kernel
。
使用 建置 /kernel
也會傳遞 /kernel
至連結器。 以下是選項如何影響連結器行為:
累加連結已停用。 如果您新增
/incremental
至命令列,連結器就會發出這個嚴重錯誤:嚴重錯誤LNK1295:'/INCREMENTAL' 與 '/KERNEL' 規格不相容;沒有 『/INCREMENTAL』 的連結
鏈接器會檢查每個物件檔案(或靜態庫包含的封存成員),以查看它是否可以使用
/kernel
選項進行編譯,但不是。 如果有任何實例符合此準則,連結器仍會成功連結,但可能會發出警告,如下表所示。Command /kernel
objnon- /kernel
obj、MASM obj 或 cvtres obj混合 /kernel
與非/kernel
objslink /kernel
Yes Yes 是,警告LNK4257 link
Yes .是 Yes LNK4257連結物件未使用 /KERNEL 編譯;映像可能無法執行
選項 /kernel
和 /driver
選項會獨立運作。 它們對彼此沒有任何影響。
在 Visual Studio 中設定 /kernel 編譯程序選項
開啟專案的 [ 屬性頁 ] 對話框。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
在 [ 其他選項] 方塊中,新增
/kernel
。 選擇 [確定] 或 [套用] 以儲存變更。