如何在Makefile中添加多个头文件路径?

如何在Makefile中添加多个头文件路径?,makefile,compilation,include,include-path,kbuild,Makefile,Compilation,Include,Include Path,Kbuild,我正在尝试编译uleds.c驱动程序,此驱动程序包含此路径下存在的多个文件: /opt/poky-atmel/2.5.3/sysroot/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux 现在我想修改我的Makefile并添加这个路径,这样我就可以正确编译uleds.c了 这是我的生成文件: #CC=arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mfpu=neon -

我正在尝试编译uleds.c驱动程序,此驱动程序包含此路径下存在的多个文件:

/opt/poky-atmel/2.5.3/sysroot/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux

现在我想修改我的Makefile并添加这个路径,这样我就可以正确编译uleds.c了

这是我的生成文件:

#CC=arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a5 --sysroot=/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi
#CC="gcc"

obj-m += uleds.o

KERNEL_SOURCE := /opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty

default:
        ${CC} ${KERNEL_SOURCE} uleds.c

clean:
        ${CC} $(INC) ${KERNEL_SOURCE} clean
有什么建议吗?谢谢

最简单的是:

${CC} -I/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux uleds.c
尝试阅读以下内容以熟悉其他GCC(编译器)选项:

最简单的是:

${CC} -I/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux uleds.c

尝试阅读以下内容以熟悉其他GCC(编译器)选项:

这似乎是对kbuild文件的尝试

您不应该使用
默认规则自己手动编译文件。相反,您应该运行内核的makefile,让它基于
obj-m
和friends编译驱动程序

您的makefile如下所示:

ifneq ($(KERNELRELEASE),)

ccflags-y += -I some/other/dir
obj-m += uleds.o

else

# default to build against running kernel if KDIR not
# specified:
KDIR ?= /lib/modules/`uname -r`/build

default:
     $(MAKE) -C $(KDIR) M=$$PWD

endif
如果从驱动程序目录调用make,它将从内核目录调用make,内核目录将了解内核的所有信息,并能够正确构建模块

请注意,默认情况下,内置内核的clean目标将删除所有生成的
*.[oas]
文件,因此不需要特殊的
clean
目标。此外,默认情况下,内核的makefile将包含自己的
include
目录,因此您可能不需要为此做任何特殊的操作。如果确实需要从其他地方包括,可以向
ccflags-y
添加
-I
指令,如示例所示


有关详细信息,请参阅和。

这似乎是对kbuild文件的尝试

您不应该使用
默认规则自己手动编译文件。相反,您应该运行内核的makefile,让它基于
obj-m
和friends编译驱动程序

您的makefile如下所示:

ifneq ($(KERNELRELEASE),)

ccflags-y += -I some/other/dir
obj-m += uleds.o

else

# default to build against running kernel if KDIR not
# specified:
KDIR ?= /lib/modules/`uname -r`/build

default:
     $(MAKE) -C $(KDIR) M=$$PWD

endif
如果从驱动程序目录调用make,它将从内核目录调用make,内核目录将了解内核的所有信息,并能够正确构建模块

请注意,默认情况下,内置内核的clean目标将删除所有生成的
*.[oas]
文件,因此不需要特殊的
clean
目标。此外,默认情况下,内核的makefile将包含自己的
include
目录,因此您可能不需要为此做任何特殊的操作。如果确实需要从其他地方包括,可以向
ccflags-y
添加
-I
指令,如示例所示


有关详细信息,请参阅和。

KERNEL\u源文件不是includes文件的文件夹。这是Linux内核的另一条路径,而不是includes。如我所见,我将在定义路径的地方添加另一个变量,然后添加:-i${variable}啊,我明白了。更正了我的答案。但是-I是答案。这是一个内核构建文件,这意味着模块应该从内核构建系统构建。
-I
可能会解决OP的第一个编译错误,但之后会遇到其他问题。KERNEL\u SOURCE不是includes文件的文件夹。这是Linux内核的另一条路径,而不是includes。如我所见,我将在定义路径的地方添加另一个变量,然后添加:-i${variable}啊,我明白了。更正了我的答案。但是-I是答案。这是一个内核构建文件,这意味着模块应该从内核构建系统构建。
-I
可能会解决OP的第一个编译错误,但之后会遇到其他问题。事实上,我正在Linux主机上工作,我正在尝试交叉编译一个驱动程序,该驱动程序将加载到与主机不同的另一个Linux内核版本中。为此,我使用了
armpokylinux-gnueabigcc(gcc)7.3.0
交叉编译器来构建uleds.ko模块。在这个makefile中,我定义了我的目标mahine linux内核的路径和所有现有的包含项OK,您需要将
KDIR
指向内核的源代码树,因此它会为此构建驱动程序。您提到的include目录看起来是标准的include目录之一,因此它应该位于生成的命令行上,但如果不是,您可以始终手动指定它ccflags-y+=-I/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux obj-m+=uleds.o else#如果未指定KDIR,则默认根据运行的内核进行构建:KDIR?=/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-C:$)(默认值)$(KDIR)M=$$PWD endif
比i-tape
make
好,但这显示了另一个错误make-C/opt/poky-atmel/2.5.3/sysroot/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty M=$PWD make[1]:正在输入目录“/opt/poky-atmel/2.5.3/sysroot/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty”make[1]:***未指定目标,未找到makefile.Stop.make[1]:正在离开目录“/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty”Makefile:13:目标“默认”的制作失败:**[默认]错误2在
/opt/poky-atmel/2.5.3/sysroot/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty
中是否有一个生成文件?内核源目录的根目录应该有一个生成文件。事实上,我正在linux主机上工作,我正在尝试交叉编译一个驱动程序,该驱动程序将加载到另一个linux内核中版本与我的主机不同。为此,我使用
arm poky linux gnueabi gcc(gcc)7.3.0
交叉编译器来构建uleds.ko模块。在这个生成文件中,我定义了目标mahine linux内核的路径以及所有现有的包。好的,您需要