首页 > 解决方案 > GCC Makefile 错误:没有规则来制作“straps.o”所需的目标“put.h”。停止

问题描述

我正在尝试使用 make run 运行我的 makefile,但它出现了一些错误:“没有规则来制作目标 'put.h','straps.o' 需要。停止”。错误是关于 GCC 在使用以下文本运行 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更新如下(参考下面帖子中给出的答案):

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)

标签: gccmakefilegnu-makeqemuinclude-path

解决方案


我认为您假设这VPATH与编译器如何定位头文件有关。绝对不是这样的。 VPATH是一个make构造,并控制make在哪里查找 makefile 中出现的目标的先决条件。

它与编译器查找预处理器包含文件的位置完全无关。要控制它,您必须向-I编译行添加选项。

所以例如使用:

VPATH = ../../../include
CFLAG += -I../../../include

推荐阅读