GCC Makefile Error : No rule to make target 'put.h', needed by 'straps.o'. Stop
GCC Makefile Error : No rule to make target 'put.h', needed by 'straps.o'. Stop
我正在尝试 运行 我的 makefile 使用 make 运行 但它出现了一些错误:“没有规则来制作目标 'put.h','straps.o' 需要。停止”。错误是关于 GCC 在 运行ning makefile 中找不到头文件 (put.h),文本如下:
内核目录下的Makefile
VPATH=../../include
all : straps.o entry.o head.o
straps.o : straps.c put.h
$(GCC) -c straps.c $(CFLAG)
entry.o : entry.S
$(GCC) -c entry.S $(CFLAG)
head.o : head.S
$(GCC) -c head.S $(CFLAG)
(straps.c 包括put.h" 所以我需要包括 put.h)
我试图在 gcc 命令行中包含头文件(通过使用 $(GCC) -c straps.c $(CFLAG) -I../include)但仍然无法正常工作。任何人都可以解释为什么我会收到此错误并在可能的情况下提出修复解决方案。谢谢
我的文件列表
Linux
├── arch
│ └── riscv
│ ├── kernel
│ │ ├── entry.S
│ │ ├── head.S
│ │ ├── Makefile
│ │ ├── straps.c
│ │ └── vmlinux.lds
│ └── Makefile
├── include
│ ├── put.h
│ └── test.h
├── init
│ ├── main.c
│ ├── Makefile
│ └── test.c
├── lib
│ ├── Makefile
│ └── put.c
└── Makefile
Main Makefile 给出的变量如下:
export
CROSS_= riscv64-unknown-elf-
AR=${CROSS_}ar
GCC=${CROSS_}gcc
LD=${CROSS_}ld
OBJCOPY=${CROSS_}objcopy
ISA ?= rv64imafd
ABI ?= lp64
INCLUDE = -I ../include
CF = -g -O3 -march=$(ISA) -mabi=$(ABI) -mcmodel=medany -ffunction-sections -fdata-sections -nostartfiles -nostdlib -nostdinc -static -lgcc -Wl,--nmagic -Wl,--gc-sections
CFLAG = ${CF} ${INCLUDE}
***解决方案:
内核目录的Makefile更新如下(参考下面post给出的答案):
VPATH = ../../../include
CFLAG += -I../../../include
all : straps.o entry.o head.o
straps.o : straps.c put.h
$(GCC) -c straps.c $(CFLAG)
entry.o : entry.S
$(GCC) -c entry.S $(CFLAG)
head.o : head.S
$(GCC) -c head.S $(CFLAG)
“straps.o:”之后的依赖项列表必须引用您在 makefile 中实际创建的对象。在该 makefile 中,您有创建 straps.o、entry.o 和 head.o 的规则,但没有 put.h。或者 straps.c 就此而言。
我认为您假设 VPATH
在某种程度上与编译器如何定位头文件有关。绝对不是这样。 VPATH
是一个 make 构造,并控制 make 在何处查找 makefile 中出现的目标的先决条件。
它与编译器寻找预处理器包含文件的位置完全无关。要控制您必须将 -I
选项添加到编译行。
例如使用:
VPATH = ../../../include
CFLAG += -I../../../include
我正在尝试 运行 我的 makefile 使用 make 运行 但它出现了一些错误:“没有规则来制作目标 'put.h','straps.o' 需要。停止”。错误是关于 GCC 在 运行ning makefile 中找不到头文件 (put.h),文本如下:
内核目录下的Makefile
VPATH=../../include
all : straps.o entry.o head.o
straps.o : straps.c put.h
$(GCC) -c straps.c $(CFLAG)
entry.o : entry.S
$(GCC) -c entry.S $(CFLAG)
head.o : head.S
$(GCC) -c head.S $(CFLAG)
(straps.c 包括put.h" 所以我需要包括 put.h) 我试图在 gcc 命令行中包含头文件(通过使用 $(GCC) -c straps.c $(CFLAG) -I../include)但仍然无法正常工作。任何人都可以解释为什么我会收到此错误并在可能的情况下提出修复解决方案。谢谢
我的文件列表
Linux
├── arch
│ └── riscv
│ ├── kernel
│ │ ├── entry.S
│ │ ├── head.S
│ │ ├── Makefile
│ │ ├── straps.c
│ │ └── vmlinux.lds
│ └── Makefile
├── include
│ ├── put.h
│ └── test.h
├── init
│ ├── main.c
│ ├── Makefile
│ └── test.c
├── lib
│ ├── Makefile
│ └── put.c
└── Makefile
Main Makefile 给出的变量如下:
export
CROSS_= riscv64-unknown-elf-
AR=${CROSS_}ar
GCC=${CROSS_}gcc
LD=${CROSS_}ld
OBJCOPY=${CROSS_}objcopy
ISA ?= rv64imafd
ABI ?= lp64
INCLUDE = -I ../include
CF = -g -O3 -march=$(ISA) -mabi=$(ABI) -mcmodel=medany -ffunction-sections -fdata-sections -nostartfiles -nostdlib -nostdinc -static -lgcc -Wl,--nmagic -Wl,--gc-sections
CFLAG = ${CF} ${INCLUDE}
***解决方案: 内核目录的Makefile更新如下(参考下面post给出的答案):
VPATH = ../../../include
CFLAG += -I../../../include
all : straps.o entry.o head.o
straps.o : straps.c put.h
$(GCC) -c straps.c $(CFLAG)
entry.o : entry.S
$(GCC) -c entry.S $(CFLAG)
head.o : head.S
$(GCC) -c head.S $(CFLAG)
“straps.o:”之后的依赖项列表必须引用您在 makefile 中实际创建的对象。在该 makefile 中,您有创建 straps.o、entry.o 和 head.o 的规则,但没有 put.h。或者 straps.c 就此而言。
我认为您假设 VPATH
在某种程度上与编译器如何定位头文件有关。绝对不是这样。 VPATH
是一个 make 构造,并控制 make 在何处查找 makefile 中出现的目标的先决条件。
它与编译器寻找预处理器包含文件的位置完全无关。要控制您必须将 -I
选项添加到编译行。
例如使用:
VPATH = ../../../include
CFLAG += -I../../../include