对不起,如果这是noob问题。
在我的c函数中,我使用btrfs_inode.h文件中定义的宏 当我将文件直接包含在路径中时:
#include "/data/kernel/linux-4.1.21-x86_64/fs/btrfs/btrfs_inode.h"
项目编译没有错误,我不想使用该直接路径,我下载包含此头文件的包kernel-source。
安装软件包后头文件的位置是:/ usr / src / linux / fs / btrfs /
所以我将#include改为:
#include "btrfs_inode.h"
我希望添加“/ usr / src / linux / fs / btrfs /”作为搜索“btrfs_inode.h”的位置并获取:“/ usr / src / linux / fs / btrfs / btrfs_inode .H“
我收到错误:
/ bin / sh:1:/ usr / src / linux / fs / btrfs /:权限被拒绝
我正在以root身份运行make。
Makefile:
all:: user
obj-m += my-driver.o
# Make arguments
PWD := $(shell pwd)
INCLUDE := -I/usr/include/asm/mach-default/
KDIR := /lib/modules/$(KERNEL_HEADERS)/build;/usr/src/linux/fs/btrfs/
# Add flags to auto build
EXTRA_CFLAGS +=-D__Linux -std=gnu99
# extra warning flags
ccflags-y := -Wall -Wextra #-pedantic
# disable some warning flags
ccflags-y += -Wno-unused-parameter
# make all warnings into errors
ccflags-y += -Werror
# increase verbosity
KBUILD_VERBOSE := 1
all::
$(MAKE) -C $(KDIR) $(INCLUDE) SUBDIRS=$(PWD) modules
答案 0 :(得分:1)
首先,尽可能避免以root身份制作。接下来,您将目录添加到KDIR
,而不是INCLUDE
(然后将KDIR
传递给make的-C
参数,这样您就会看到一行:
make -C /lib/modules/$(KERNEL_HEADERS)/build;/usr/src/linux/fs/btrfs/ ...
注意分号,bash将作为命令的结尾插入,并开始下一个命令。因此它尝试运行make,然后尝试运行/usr/src/linux/fs/btrfs/
,并向您发出警告。你应该拥有的是:
# Make arguments
PWD := $(shell pwd)
INCLUDE := -I/usr/include/asm/mach-default/
INCLUDE += -I/usr/src/linux/fs/btrfs/
KDIR := /lib/modules/$(KERNEL_HEADERS)/build
(您希望路径前面有-I
告诉make在该目录中搜索包含文件。)
修改强>
您也没有将-I
传递给$(CC)
或$(CXX)
命令。要做到这一点,你有几个选项,虽然我建议最不容易出错:首先,你必须将标志传递给子make。为此,首先添加以下行:
export INCLUDE
到您的主makefile。您的子邮件现在可以访问变量$(INCLUDE)
。从那里,如果您有一个明确的规则来编译CC文件,您可以将$(INCLUDE)
添加到编译命令。像
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDE) -o $@ $<
或者,如果您使用的是内置隐式规则,只需将$(INCLUDE)
添加到CPP_FLAGS
:
CPP_FLAGS += $(INCLUDE)
(注意,默认情况下,CPP_FLAGS
用于c和c ++编译)。
最后,不将$(INCLUDE)
传递给您的make
命令。如果这样做,它会告诉 make
查找这些目录中的子makefile(不是gcc
...)。
答案 1 :(得分:0)
通过this question我可以理解,您可以在Makefile中添加多个-I标志。