/kernel (Create Kernel Mode Binary)
Tworzy plik binarny, który może być wykonywana w jądrze systemu Windows.
/kernel[-]
Argumenty
/kernel
Kod w bieżącym projekcie jest skompilowany i połączone przy użyciu zestawu reguł języka C++, które są specyficzne dla kodu, który będzie uruchamiany w trybie jądra./kernel-
Kod w bieżącym projekcie jest skompilowany i połączone bez korzystania z reguły języka C++, które są specyficzne dla kodu, który będzie uruchamiany w trybie jądra.
Uwagi
Ma nie #pragma równoważne do kontrolowania tej opcji.
Określanie /kernel opcja informuje kompilator i program łączący rozstrzygają są dopuszczalne w trybie jądra, które funkcje językowe i upewnij się, że czy masz wystarczające ekspresji, aby uniknąć niestabilność runtime który jest unikatowy w trybie jądra C++.Można to osiągnąć poprzez zabronienie stosowania funkcji języka C++, które są nieodpowiednie w trybie jądra oraz dostarczając ostrzeżenia dla funkcji języka C++, które są potencjalnie uciążliwy, ale nie można go wyłączyć.
/kernel Opcja ma zastosowanie do fazy kompilator i program łączący kompilacji i jest ustawiona na poziomie projektu.Przekazać /kernel przełącznika, aby wskazać kompilator, że powstały plik binarny, po połączeniu, powinien być ładowany w jądrze systemu Windows.Kompilator będzie wąskie spektrum funkcje języka C++ do podzbioru, który jest zgodny z jądra.
W poniższej tabeli wymieniono zmiany w zachowaniu kompilatora przy /kernel jest określony.
Typ zachowania |
/kernelZachowanie |
---|---|
Obsługę wyjątków C++ |
Wyłączone.Wszystkie wystąpienia throw i try słowa kluczowe emitują błąd kompilatora (z wyjątkiem specyfikacji wyjątek throw()).Nie /EH opcje są zgodne z /kernel, z wyjątkiem /EH-. |
ROBOCZĄ |
Wyłączone.Wszystkie wystąpienia dynamic_cast i typeid słowa kluczowe emitują błąd kompilatora, chyba że dynamic_cast jest używana statycznie. |
new i delete |
Należy jawnie zdefiniować new() lub delete() operatora; Kompilator ani środowiska wykonawczego nie dostarczy domyślną definicją. |
Niestandardowa konwencje, wywoływania /GS budować opcji, a wszystkie optymalizacje są dozwolone podczas korzystania /kernel opcji.Dużym stopniu nie podlega Inlining /kernel, z tą samą semantyką honorowane przez kompilator.Aby upewnić się, że __forceinline jest honorowane inline kwalifikator, należy upewnić się tego ostrzeżenia, C4714 jest włączone, tak aby było wiadomo, kiedy dany __forceinline funkcja nie jest inlined.
Kiedy kompilator jest przekazywana /kernel powoduje wstępne przełącznika, to definiowanie preprocesora makro o nazwie _KERNEL_MODE i ma wartość 1.Umożliwia to warunkowo skompilować kodu w oparciu o czy środowisko wykonawcze jest w trybie użytkownika lub w trybie jądra.Na przykład poniższy kod określa, że klasa powinna być w segmencie pamięci niestronicowanej, gdy jest kompilowana na działanie w trybie jądra.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
Niektóre następujących kombinacji docelowej architektury i /arch opcja wygenerowanie błędu, jeśli są używane z /kernel:
**/arch:{SSE|SSE2|AVX}**nie są obsługiwane w architekturze x 86.Tylko /arch:IA32 jest obsługiwane w przypadku /kernel w architekturze x 86.
/arch:AVXnie jest obsługiwany przez /kernel x 64.
Budynek z /kernel również przechodzi /kernel do programu łączącego.Jej jest jej wpływu na zachowanie programu łączącego:
Łączenie przyrostowe jest wyłączona.Jeśli dodasz /incremental do wiersza polecenia, program łączący emituje to błąd krytyczny:
LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'
Program łączący sprawdza każdy plik obiektu (lub któregokolwiek członka uwzględniane archiwum z bibliotek statycznych), aby zobaczyć, czy to może zostały skompilowane przy użyciu /kernel opcji ale nie zostało.Jeśli wszystkie wystąpienia spełniają to kryterium, program łączący nadal pomyślnie łączy, ale może być upomnienia, jak pokazano w poniższej tabeli.
/kernelobj
/kernel-obj, MASM obj lub cvtresed
Mix of /kernel and /kernel- objs
łącze /kernel
Tak
Tak
Tak z ostrzeżenie LNK4257
łącze
Tak
Tak
Tak
LNK4257 linking object not compiled with /KERNEL ; image may not run
/kernel Opcji i /driver opcja działa niezależnie i nie wpływa na inne.
Aby ustawić opcję kompilatora /kernel w programie Visual Studio
Otwórz Stron właściwości okno dialogowe dla projektu.Aby uzyskać więcej informacji, zobacz Jak: Otwórz strony właściwości projektu.
Wybierz C/C++ folder.
Wybierz wiersza polecenia strona właściwości.
W dodatkowe opcje pole, dodać /kernel lub /kernel-.