/kernel (Create Kernel Mode Binary)
若要在 Windows 核心可以執行的二進位檔。
/kernel[-]
引數
/kernel
目前專案中的程式碼會編譯,並將其連結至使用一組特有的程式碼為目標的 C++ 語言規則。在核心模式中執行。/kernel-
目前專案中的程式碼會編譯,並連接,而不使用專用的程式碼中的 C++ 語言規則在核心模式中執行。
備註
沒有控制這個選項的對等 #pragma 。
指定 /kernel 選項會通知編譯器和連結器仲裁哪些語言功能是可允許的核心模式,並確定該您有足夠的表現功能避免核心模式 C++ 特有的執行階段不穩定。這項作業不允許使用完成 C++ 是受到干擾在核心模式和透過提供警告為 C++ 語言功能可能破壞性的語言功能,但是不能停用。
/kernel 選項會套用至組建的編譯器和連結器階段並在專案層級。透過 /kernel 參數指示編譯器應該載入產生的二進位檔,在連接之後,在 Windows 核心。編譯器會使範圍 C++ 語言功能窄與核心相容的子集。
當 /kernel 時,下表列出編譯器行為的變更。
行為類型。 |
/kernel 行為 |
---|---|
C++ 例外狀況處理。 |
停用。throw 與 try 關鍵字的所有執行個體發出編譯器錯誤 (除了例外狀況規格為 throw())。/EH 選項與 /kernel相容,除了 /EH-。 |
RTTI |
停用。除非以靜態方式,使用 dynamic_castdynamic_cast 和 typeid 關鍵字的所有執行個體發出編譯器錯誤。 |
new 和 delete |
您必須明確定義 new() 或 delete() 運算子;編譯器和執行階段不會提供一個預設定義。 |
當您使用 /kernel 選項時,自訂呼叫慣例, /GS 建置選項和所有最佳化之中。內嵌受 /kernel的主要不影響,而相同的語意接受由編譯器。如果您要確定,內嵌限定詞的 __forceinline 接受,您必須確定,啟用警告 C4714 ,讓您知道特定 __forceinline 函式時沒有內嵌。
當編譯器在 /kernel 參數時,它會定義名為 _KERNEL_MODE 且具有值 1的前置處理器巨集。您可以使用此條件式編譯以程式碼執行環境是否在使用者模式或核心模式。例如,下列程式碼指定類別應該在不可分頁的記憶體時,會為核心模式執行時編譯。
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
會與 /kernel搭配使用時,有些目標架構和 /arch 選項的下列組合會產生錯誤:
/arch:{SSE|SSE2|AVX} 在 x86 上不支援。/arch:IA32 只支援具有 x86 的 /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 的混合
LINK /kernel
是
是
與警告 LNK4257
link
是
是
是
LNK4257 linking object not compiled with /KERNEL ; image may not run
/kernel 選項與 /driver 選項獨立運作和都不會影響其他。
在 Visual Studio 中設定 /kernel 編譯器選項
開啟專案的 [屬性頁] 對話方塊。如需詳細資訊,請參閱HOW TO:開啟專案屬性頁。
選取 [C/C++] 資料夾。
選取 [命令列] 屬性頁。
在 [其他選項] 方塊中新增 /kernel 或 /kernel-。