/kernel (Utwórz plik binarny trybu jądra)
Tworzy plik binarny, który może być wykonany 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 zostanie uruchomiony w trybie jądra./kernel-
Kod w bieżącym projekcie zostanie skompilowany i połączony bez użycia reguły języka C++, które są specyficzne dla kodu, który zostanie uruchomiony w trybie jądra.
Uwagi
Nie ma odpowiednika #pragma do kontrolowania tej opcji.
Określanie /kernel opcja informuje kompilator i linker arbitrażu są dopuszczalne w trybie jądra, które funkcje języka i upewnić się, że czy masz wystarczające ekspresji, aby uniknąć niestabilności runtime, który jest unikatowy w języku C++ w trybie jądra.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 dotyczy zarówno kompilatora i linker fazy kompilacji i jest ustawiona na poziomie projektu.Przekazać /kernel przełącznika, aby wskazać kompilator, że powstały plik binarny, po połączeniu, powinny być załadowane do jądra 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 przedstawiono zmiany w zachowaniu kompilator po /kernel jest określony.
Typ zachowania |
/kernelZachowanie |
---|---|
Obsługa wyjątków w języku 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żywany statycznie. |
new i delete |
Należy jawnie zdefiniować new() lub delete() operatora; Kompilator ani runtime nie poda domyślną definicją. |
Niestandardowe konwencje, wywoływania /GS opcji kompilacji i wszystkie optymalizacje są dozwolone podczas korzystania /kernel opcji.Inline dużej mierze nie występuje w /kernel, z tą samą semantyką honorowane przez kompilator.Jeśli chcesz mieć pewność, że __forceinline honorowane inline kwalifikator, należy się upewnić, że ostrzeżenie C4714 jest włączony, tak aby było wiadomo, kiedy określonego __forceinline funkcja nie jest inlined.
Kiedy kompilator jest przekazywana /kernel przełącznika, to powoduje wstępne definiowanie preprocesora makro o nazwie _KERNEL_MODE i ma wartość 1.Umożliwia to warunkowo skompilować kod, zależnie od tego, czy środowisko wykonawcze jest w trybie jądra lub trybu użytkownika.Na przykład poniższy kod określa, że klasa powinna być w segmencie pamięci niestronicowanej, gdy jest kompilowany do wykonania trybu jądra.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
Niektóre następujące kombinacje docelowej architektury i /arch opcji wygenerować błąd, gdy są one używane przez /kernel:
**/arch:{SSE|SSE2|AVX}**nie są obsługiwane na x 86.Tylko /arch:IA32 jest obsługiwany z /kernel na x 86.
/arch:AVXnie jest obsługiwany w /kernel x 64.
Budowanie z /kernel również przechodzi /kernel do linker.Jej jest jak to wpływa na zachowanie linker:
Łączenie przyrostowe jest wyłączona.Jeśli dodasz /incremental do wiersza polecenia, program łączący emituje ten 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 może on zostały skompilowane przy użyciu /kernel opcji ale nie zostało.Jeśli wszystkie wystąpienia spełnia to kryterium, linker nadal pomyślnie łączy, ale może być ostrzeżenie, 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 okno dialogowe Strony właściwości dla projektu.Aby uzyskać dodatkowe informacje, zobacz Porady: otwieranie stron właściwości projektów.
Wybierz folder C/C++.
Wybierz stronę właściwości Wiersz polecenia.
W dodatkowe opcje pole, dodać /kernel lub /kernel-.