GNU在Windows上制作模式规则

时间:2017-12-09 22:57:57

标签: c windows makefile gnu

我最近在使用我在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 [...]“如果你知道为什么会这样,我也想知道。

提前致谢。

1 个答案:

答案 0 :(得分:2)

  • 您在模式规则
  • 之后有一个虚假的; 如果在内部使用反斜杠,
  • make on windows将无法正常工作,使用正斜杠更容易,只有在需要没有它们的情况下才能使用的Windows工具时才更换,例如{{1} }。

  • 您不需要使用Windows shell进行大量文件处理,因此具有内部功能。

  • 链接(del等)时编译标志无效,编译时{link -Wall
  • 链接标志无效
  • 当目标文件完全依赖于所需的标头时,您已迫使最终的可执行文件依赖于所有标头。使用gcc的依赖关系生成功能-lm等,改为使用-MMD功能。
  • 默认情况下,
  • -include会扩展为CC,这应该是默认编译器的链接或副本,在您的情况下,只需将cc复制到bin中的gcc目录
  • make有许多常见操作的内置规则和配方,回收它们

您的makefile可以按如下方式压缩:

cc