预处理器宏 D__KERNEL__ 和 __KERNEL__ 之间的区别

Difference between preprocessor macros D__KERNEL__ and __KERNEL__

我是 linux 内核编程的绝对初学者,如果问题太初级,我很抱歉。

在这里 https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch02s02.html 我找到了以下示例:

# Change it here or specify it on the "make" command line

KERNELDIR = /usr/src/linux

include $(KERNELDIR)/.config
CFLAGS = -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include \ -O -Wall


ifdef CONFIG_SMP
CFLAGS += -D__SMP__ -DSMP
endif

all: skull.o

skull.o: skull_init.o skull_clean.o
$(LD) -r $^ -o $@

clean:
rm -f *.o *~ core

我的问题只是预处理器宏 __KERNEL__ 和使用的 -D__KERNEL__ 之间的区别是什么?特别是这里的“-D”是什么意思? (顺便说一下 MODULE-DMODULE 的故事)。

-D 是一个 option to the compiler(或预处理器),告诉它定义一个宏。所以将-D__KERNEL__放在编译器命令行上与将#define __KERNEL__放在文件顶部是完全一样的。同样,-DFOO 将定义一个名为 FOO.

的宏

此处没有定义名为 D__KERNEL__ 的宏。