【发布时间】:2008-10-19 17:38:08
【问题描述】:
在recent issue 中,我发现DJGPP 只能接受DOS 命令行字符限制。为了解决这个限制,我决定尝试编写一个makefile 来允许我pass longer strings。在编写一个makefile并对其进行测试的过程中,我遇到了一个奇怪的错误。生成文件如下:
AS := nasm
CC := gcc
LD := ld
TARGET := $(shell basename $(CURDIR))
BUILD := build
SOURCES := source
CFLAGS := -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
-nostdinc -fno-builtin -I./include
ASFLAGS := -f aout
export OUTPUT := $(CURDIR)/$(TARGET)
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
SOBJS := $(SFILES:.s=.o)
COBJS := $(CFILES:.c=.o)
OBJS := $(SOBJS) $(COBJS)
build : $(TARGET).img
$(TARGET).img : $(TARGET).bin
concat.py
$(TARGET).bin : $(OBJS)
$(LD) -T link.ld -o $@ $^
$(SOBJS) : %.o : %.asm
$(AS) $(ASFLAGS) $< -o $@
$(COBJS) : %.o : %.c
$(CC) -c $< $(CFLAGS) -o $@
在尝试运行它时,我收到此错误:
make: *** 没有规则来制作目标 `consoleio.c',`consoleio.o' 需要。停止。
我不明白为什么它试图为 .c 文件寻找规则。据我了解,如果文件在那里,它应该只使用它。如何使 .c 文件不需要规则?
【问题讨论】:
-
(a) 是什么让您认为 makefile 可以绕过命令行限制? (b) consoleio.o 的源文件是什么? (c) 用汇编编码是不是有点古怪?
-
继续:(d) 您使用 := 分配的目标是哪个版本的“make”?这是一个非标准的符号。
-
(a)delorie.com/djgpp/v2faq/faq16_4.html (b) consoleio.c (c) 它用于多重引导头文件,仅此而已。
-
并且,为了保持一致性:$(shell ...) 和 $(foreach ...) 等符号也是非标准的。在这种情况下,标准是指 POSIX 标准。我相信您可能针对的是 GNU Make,但请注意,有许多 make 变体可供选择。
-
是的,我正在使用 GNU 扩展。我不知道makefile,但我知道的很多。
标签: makefile