我最近在使用我在Linux上使用的makefile时遇到了一些麻烦,现在已经有很长一段时间了。 它的逻辑在于生成包含用于编译过程的所有对象,源文件和头文件的字符串;但是我只对需要某种特殊处理的objetcs写了特定的规则,其余的我使用了以下模式规则:
obj/%.o: src/%.c
$(CC) $(CFLAGS) $< -o $@
在Linux上它可以工作,但是当我尝试在Windows上使用时,当然会有一些变化,但它没有,我得到以下错误:
制作:***没有规则可以制作目标'obj \ battle.o','programa'需要。停止
我一直试图独自解决这个问题,但这很难。
Linux'makefile:
SOURCES := $(shell ls src/*.c)
SUBST1 := $(subst src/,obj/,$(SOURCES))
OBJECTS := $(subst .c,.o,$(SUBST1))
HEADERS := $(shell ls headers/*.h)
CC = gcc
LFLAGS = -g -I headers/ -o programa -Wall -pedantic
CFLAGS = -g -I headers/ -c -Wall -pedantic
programa: $(OBJECTS) $(HEADERS)
$(CC) $(LFLAGS) $(OBJECTS) -lm
obj/arvore.o: src/arvore.c
$(CC) $(CFLAGS) -lm $< -o $@
obj/main.o: $(HEADERS)
obj/%.o: src/%.c
$(CC) $(CFLAGS) $< -o $@
clean:
ifneq ($(shell ls obj/*.o),)
rm obj/*.o
endif
ifneq ($(findstring ./programa, $(shell find . -maxdepth 1 -perm -111 -type f)),)
rm programa
endif
##############################################################
.PHONY = programa organize clean
Windows'makefile:
AA = aa
SOURCES := $(shell dir /b /s src\*.c)
SUBST1 := $(subst $(shell cd)\, ,$(SOURCES))
SUBST2 := $(subst src\,obj\,$(SUBST1))
OBJECTS := $(subst .c,.o,$(SUBST2))
HEADERS := $(shell dir /b /s headers\*.h)
CC = gcc
LFLAGS = -g -o jogo -Wall -pedantic
CFLAGS = -g -c -Wall -pedantic
programa: $(OBJECTS) $(HEADERS)
$(CC) $(LFLAGS) $(OBJECTS) -lm
obj\main.o: src\main.c $(HEADERS)
$(CC) $(CFLAGS) $< -o $@
obj\arvore.o: src\arvore.c
$(CC) $(CFLAGS) -lm $< -o $@
obj\%.o: src\%.c;
$(CC) $(CFLAGS) $< -o $@
clean:
ifneq ($(findstring .o, $(shell dir /b obj\*.o)),)
del obj\*.o
endif
ifneq ($(findstring jogo.exe, $(shell dir /b *.exe)),)
del jogo.exe
endif
PS:Windows的makefile上的变量AA,它是一个临时修复,因为没有它通常它会从第一个变量“吃掉”一个字符,例如让我们说CC = gcc它是第一个,cmd上的命令变为“ cc -g [...]“如果你知道为什么会这样,我也想知道。
提前致谢。
答案 0 :(得分:2)
;
如果在内部使用反斜杠,make on windows将无法正常工作,使用正斜杠更容易,只有在需要没有它们的情况下才能使用的Windows工具时才更换,例如{{1} }。
您不需要使用Windows shell进行大量文件处理,因此具有内部功能。
del
等)时编译标志无效,编译时{link -Wall
-lm
等,改为使用-MMD
功能。-include
会扩展为CC
,这应该是默认编译器的链接或副本,在您的情况下,只需将cc
复制到bin中的gcc
目录您的makefile可以按如下方式压缩:
cc