如何在Makefile中添加多个头文件路径?
我正在尝试编译uleds.c驱动程序,此驱动程序包含此路径下存在的多个文件: /opt/poky-atmel/2.5.3/sysroot/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux 现在我想修改我的Makefile并添加这个路径,这样我就可以正确编译uleds.c了 这是我的生成文件:如何在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 -
#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-tapemake
好,但这显示了另一个错误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内核的路径以及所有现有的包。好的,您需要