Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 没有规则使目标为';%。o';_C_Linux_Makefile_Gnu Make - Fatal编程技术网

C 没有规则使目标为';%。o';

C 没有规则使目标为';%。o';,c,linux,makefile,gnu-make,C,Linux,Makefile,Gnu Make,不知为什么,GNU Make没有为我做这项工作。我有这个MAKE文件,我确保每个配方都使用tab,而不是空格。不管我怎么看,我就是找不到任何会导致错误消息的地方 操作系统:Ubuntu 17.10/GNU Make:4.1/GCC:交叉编译到i686 elf GCC 运行它:make(在同一目录中)给我 我有一个bash脚本,它做了完全相同的事情,它的工作方式很有魅力。谁知道我做错了什么 生成文件: NASM=nasm QEMU=qemu-system-i386 GCC=~/opt/cross/

不知为什么,GNU Make没有为我做这项工作。我有这个MAKE文件,我确保每个配方都使用tab,而不是空格。不管我怎么看,我就是找不到任何会导致错误消息的地方

操作系统:Ubuntu 17.10/GNU Make:4.1/GCC:交叉编译到i686 elf GCC

运行它:make(在同一目录中)给我

我有一个bash脚本,它做了完全相同的事情,它的工作方式很有魅力。谁知道我做错了什么

生成文件:

NASM=nasm
QEMU=qemu-system-i386
GCC=~/opt/cross/bin/i686-elf-gcc
CFLAGS=-std=c11 -ffreestanding -Wall -Wextra -Werror -masm=intel -g -O0
ASFLAGS=-felf32 -g

.PHONY: all clean
all:boot.iso

%.o : %.c
    $(GCC) -c $< $(CFLAGS) -o $@

%.so : %.asm
    $(NASM) $(ASFLAGS) -o $@ $<

kernel.elf : %.o
    $(GCC) -T link.ld -o $@ -ffreestanding -O0 -nostdlib -lgcc --verbose $^
    grub-file --is-x86-multiboot2 kernel.elf

boot.iso : kernel.elf grub.cfg
    mkdir -p ./iso/boot/grub
    cp kernel.elf ./iso/boot
    cp grub.cfg ./iso/boot/grub
    grub-mkrescue -o $@ ./iso

run: boot.iso
    $(QEMU) -cdrom $< -D log/qemu.log -d guest_errors -m 2048M -daemonize -serial file:log/boot.log

debug: boot.iso
    $(QEMU) -cdrom $< -D log/qemu.log -d guest_errors -m 2048M -daemonize -serial file:log/boot.log -s -S
    gdb ./kernel.elf -ex "target remote :1234" --tui

clean:
    rm -f ./*.o
    rm -f ./kernel.elf
    rm -rf ./iso
NASM=NASM
QEMU=QEMU-system-i386
GCC=~/opt/cross/bin/i686 elf GCC
CFLAGS=-std=c11-ffreserving-Wall-Wextra-Werror-masm=intel-g-O0
ASFLAGS=-felf32-g
.骗子:都是干净的
全部:boot.iso
%.o:%.c
$(GCC)-c$<$(CFLAGS)-o$@
%.so:%.asm
$(NASM)$(ASFLAGS)-o$@$<
kernel.elf:%.o
$(GCC)-T link.ld-o$@-ffreestanding-O0-nostlib-lgcc-verbose$^
grub文件——is-x86-multiboot2 kernel.elf
boot.iso:kernel.elf grub.cfg
mkdir-p./iso/boot/grub
cp kernel.elf./iso/boot
cp grub.cfg./iso/boot/grub
grub MKSERCUE-o$@./iso
运行:boot.iso
$(QEMU)-cdrom$<-D log/QEMU.log-D guest_errors-m 2048M-daemonize-serial file:log/boot.log
调试:boot.iso
$(QEMU)-cdrom$<-D log/QEMU.log-D guest_errors-m 2048M-daemonize-serial file:log/boot.log-s-s
gdb./kernel.elf-ex“目标远程:1234”--tui
清洁:
rm-f./*.o
rm-f./kernel.elf
rm-rf./iso
使用-d选项运行make可输出以下内容:

GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Reading makefile 'Makefile'...
Updating makefiles....
 Considering target file 'Makefile'.
  Looking for an implicit rule for 'Makefile'.

  ... a bunch of ...
  Trying pattern rule with stem 'Makefile'.
  Trying implicit prerequisite 'Makefile.o'. <-- last line
  ... end a bunch of ...

  Looking for a rule with intermediate file 'Makefile.o'.
   Avoiding implicit rule recursion.

   ... a bunch of ...
   Trying pattern rule with stem 'Makefile'.
   Trying implicit prerequisite 'Makefile.c'. <--- last line
   ... end a bunch of ...

   Looking for a rule with intermediate file 'Makefile.c'.
    Avoiding implicit rule recursion.
    Avoiding implicit rule recursion.

    ... a bunch of ...
    Trying pattern rule with stem 'Makefile'.
    Trying implicit prerequisite 'Makefile.y'.
    ... end a bunch of ...

    Looking for a rule with intermediate file 'Makefile.y'.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.

     ... a bunch of ...
     Trying pattern rule with stem 'Makefile.y'.
     Trying implicit prerequisite 'SCCS/s.Makefile.y'. <-- last line
     ... end a bunch of ...
     ... I'm too tired to clean it up ....
     ... is all the same thing for Makefile

Updating goal targets....
Considering target file 'all'.
 File 'all' does not exist.
  Considering target file 'boot.iso'.
   File 'boot.iso' does not exist.
    Considering target file 'kernel.elf'.
     File 'kernel.elf' does not exist.
      Considering target file '%.o'.
       File '%.o' does not exist.
       Looking for an implicit rule for '%.o'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.c'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cc'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.C'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cpp'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.p'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.f'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.F'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.m'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.r'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.s'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.S'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.mod'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite '%.o,v'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 'RCS/%.o,v'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 'RCS/%.o'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 's.%.o'.
       Trying pattern rule with stem '%.o'.
       Trying implicit prerequisite 'SCCS/s.%.o'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.c'.
       Looking for a rule with intermediate file '%.c'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.y'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.l'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.w'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.w'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite '%.c,v'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 'RCS/%.c,v'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 'RCS/%.c'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 's.%.c'.
        Trying pattern rule with stem '%.c'.
        Trying implicit prerequisite 'SCCS/s.%.c'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.y'.
        Looking for a rule with intermediate file '%.y'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite '%.y,v'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 'RCS/%.y,v'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 'RCS/%.y'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 's.%.y'.
         Trying pattern rule with stem '%.y'.
         Trying implicit prerequisite 'SCCS/s.%.y'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.l'.
        Looking for a rule with intermediate file '%.l'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite '%.l,v'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 'RCS/%.l,v'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 'RCS/%.l'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 's.%.l'.
         Trying pattern rule with stem '%.l'.
         Trying implicit prerequisite 'SCCS/s.%.l'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.w'.
        Looking for a rule with intermediate file '%.w'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite '%.w,v'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 'RCS/%.w,v'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 'RCS/%.w'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 's.%.w'.
         Trying pattern rule with stem '%.w'.
         Trying implicit prerequisite 'SCCS/s.%.w'.
        Trying pattern rule with stem '%'.
        Rejecting impossible rule prerequisite '%.w'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cc'.
       Looking for a rule with intermediate file '%.cc'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite '%.cc,v'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 'RCS/%.cc,v'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 'RCS/%.cc'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 's.%.cc'.
        Trying pattern rule with stem '%.cc'.
        Trying implicit prerequisite 'SCCS/s.%.cc'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.C'.
       Looking for a rule with intermediate file '%.C'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite '%.C,v'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 'RCS/%.C,v'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 'RCS/%.C'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 's.%.C'.
        Trying pattern rule with stem '%.C'.
        Trying implicit prerequisite 'SCCS/s.%.C'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.cpp'.
       Looking for a rule with intermediate file '%.cpp'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite '%.cpp,v'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 'RCS/%.cpp,v'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 'RCS/%.cpp'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 's.%.cpp'.
        Trying pattern rule with stem '%.cpp'.
        Trying implicit prerequisite 'SCCS/s.%.cpp'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.p'.
       Looking for a rule with intermediate file '%.p'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.web'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite '%.p,v'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 'RCS/%.p,v'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 'RCS/%.p'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 's.%.p'.
        Trying pattern rule with stem '%.p'.
        Trying implicit prerequisite 'SCCS/s.%.p'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.web'.
        Looking for a rule with intermediate file '%.web'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite '%.web,v'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 'RCS/%.web,v'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 'RCS/%.web'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 's.%.web'.
         Trying pattern rule with stem '%.web'.
         Trying implicit prerequisite 'SCCS/s.%.web'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.f'.
       Looking for a rule with intermediate file '%.f'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.F'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.r'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite '%.f,v'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 'RCS/%.f,v'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 'RCS/%.f'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 's.%.f'.
        Trying pattern rule with stem '%.f'.
        Trying implicit prerequisite 'SCCS/s.%.f'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.F'.
        Looking for a rule with intermediate file '%.F'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite '%.F,v'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 'RCS/%.F,v'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 'RCS/%.F'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 's.%.F'.
         Trying pattern rule with stem '%.F'.
         Trying implicit prerequisite 'SCCS/s.%.F'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.r'.
        Looking for a rule with intermediate file '%.r'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%'.
         Rejecting impossible rule prerequisite '%.l'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite '%.r,v'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 'RCS/%.r,v'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 'RCS/%.r'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 's.%.r'.
         Trying pattern rule with stem '%.r'.
         Trying implicit prerequisite 'SCCS/s.%.r'.
       Trying pattern rule with stem '%'.
       Rejecting impossible rule prerequisite '%.F'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.m'.
       Looking for a rule with intermediate file '%.m'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.ym'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite '%.m,v'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 'RCS/%.m,v'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 'RCS/%.m'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 's.%.m'.
        Trying pattern rule with stem '%.m'.
        Trying implicit prerequisite 'SCCS/s.%.m'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.ym'.
        Looking for a rule with intermediate file '%.ym'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite '%.ym,v'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 'RCS/%.ym,v'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 'RCS/%.ym'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 's.%.ym'.
         Trying pattern rule with stem '%.ym'.
         Trying implicit prerequisite 'SCCS/s.%.ym'.
       Trying pattern rule with stem '%'.
       Rejecting impossible rule prerequisite '%.r'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.s'.
       Looking for a rule with intermediate file '%.s'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.S'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite '%.s,v'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 'RCS/%.s,v'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 'RCS/%.s'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 's.%.s'.
        Trying pattern rule with stem '%.s'.
        Trying implicit prerequisite 'SCCS/s.%.s'.
        Trying pattern rule with stem '%'.
        Trying rule prerequisite '%.S'.
        Looking for a rule with intermediate file '%.S'.
         Avoiding implicit rule recursion.
         Avoiding implicit rule recursion.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite '%.S,v'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 'RCS/%.S,v'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 'RCS/%.S'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 's.%.S'.
         Trying pattern rule with stem '%.S'.
         Trying implicit prerequisite 'SCCS/s.%.S'.
       Trying pattern rule with stem '%'.
       Rejecting impossible rule prerequisite '%.S'.
       Trying pattern rule with stem '%'.
       Trying rule prerequisite '%.mod'.
       Looking for a rule with intermediate file '%.mod'.
        Avoiding implicit rule recursion.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite '%.mod,v'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 'RCS/%.mod,v'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 'RCS/%.mod'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 's.%.mod'.
        Trying pattern rule with stem '%.mod'.
        Trying implicit prerequisite 'SCCS/s.%.mod'.
       No implicit rule found for '%.o'.
       Finished prerequisites of target file '%.o'.
      Must remake target '%.o'.
make: *** No rule to make target '%.o', needed by 'kernel.elf'.  Stop.
GNU Make 4.1
为x86_64-pc-linux-gnu构建
版权所有(C)1988年至2014年自由软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
正在读取生成文件。。。
正在读取makefile“makefile”。。。
正在更新生成文件。。。。
正在考虑目标文件“Makefile”。
正在查找“Makefile”的隐式规则。
... 一堆。。。
正在尝试使用词干“Makefile”的模式规则。

正在尝试隐式先决条件“Makefile.o” 问题在于以下规则:

kernel.elf : %.o
GNU Make实际上将
%.o
视为先决条件,而不是模式

我建议您定义一个包含目标文件名称的
obj
变量,并将规则重写为:

kernel.elf: $(obj)
这种
obj
变量的定义可以是:

obj := $(patsubst %.c,%.o,$(wildcard *.c))
obj += $(patsubst %.asm,%.so,$(wildcard *.asm))

$(GCC)-c$<$(CFLAGS)-o$@
-->
$(GCC)$(CFLAGS)$<-o$@
我认为您需要删除冒号前的空格。不过不确定。@Gaurav,我尝试了你的建议,但没有成功……我认为问题在于
kernel.elf:%.o
,这是制作
kernel.elf
的规则。Make查找目标
%.o
,但由于它是泛型的,所以不知道要使用什么文件。如果您使用
kernel.elf:kernel.o
或任何创建内核实际需要的文件,它应该可以工作。(下面同时回答)另请参见和,其中的答案似乎告诉您对对象文件使用通配符。也许GNUMake没有理解
kernel.elf
中的
*.elf
扩展。它可以工作!非常感谢你!我整晚都在挠头!这难道不是一个先决条件吗?否则,当更新%.c时,它将如何知道如何编译适当的.o目标?@assimilator我的意思是,原始先决条件实际上是
%.o
(即,一个名为
%.o
的文件,而不是
.o
文件的模式)。按照我的方法,扩展
$(obj)
产生的文件列表成为
kernel.elf
的先决条件。此列表由
.o
文件组成,当更新相应的
.c
时,将使用OP的规则
%.o:%.c
obj := $(patsubst %.c,%.o,$(wildcard *.c))
obj += $(patsubst %.asm,%.so,$(wildcard *.asm))