Makefile не обнаруживает правила

#c #makefile

#c #makefile

Вопрос:

Для моего проекта я пытаюсь создать makefile для компиляции моего проекта, но в первый раз у меня есть дерево папок. Я хочу скомпилировать это:

 makefile
main.c
src
   folder1
      code1.c
      code2.c
   folder2
      code3.c
      code4.c
   folder3
      code5.c
      code6.c
obj
   folder1
      code1.o
      code2.o
   folder2
      code3.o
      code4.o
   folder3
      code5.o
      code6.o
  

и мой makefile похож

 CFLAGS=-Wall -lncursesw -lm -lpthread
CC=gcc 
OBJS=obj
EXE=SimulateurCompile
INCLUDE=AllInclude.h

SRC_FOLDER:=$(wildcard src/*)
SRC_FOLDER:=$(SRC_FOLDER:src/%=obj/%)

SRC=$(wildcard src/*/*.c) main.c
OBJS = $(patsubst %.c, %.o, $(SRC))
OBJS:=$(OBJS:src/%=obj/%)


%.o: %.c
    @echo "PASSAGE"
    ACompiler:=$($<:$(OBJS)%=src%)
    @echo $(ACompiler)
    @mkdir -p $(SRC_FOLDER)
    $(CC) -o $@ -c -g $(ACompiler) $(CFLAGS)

all:$(OBJS)
    gcc  $(SRC) -c -g -o $(OBJS) $(CFLAGS)
    @echo "Passage dans alln"
    gcc -o $(EXE) $(OBJS) $(CFLAGS) -I $(INCLUDE)
  

Но makefile не обнаруживает правило для create .o
Кто-нибудь знает, почему и как я могу создать makefile для моего дерева файлов?

Извините за мой английский, спасибо, что прочитал меня: D

Комментарии:

1. Вы позаботились о табуляциях вместо пробелов, не так ли?

2. %.o: %.c: работает с файлами в текущем рабочем каталоге. Он ничего не знает о src or folder1 или SRC_FOLDER или любой подобной вещи.

3. Также вы не можете иметь -o $(OBJS) ; ваши рецепты должны показывать, как компилировать по одному файлу за раз.

Ответ №1:

Я думаю, вы хотите что-то вроде этого:

 SRCS:=$(wildcard src/*/*.c)
OBJS:=$(patsubst src/%.c,obj/%.o,$(ALL_SRCS))

# Dump the above to make sure there weren't any errors so far:
$(info SRCS = $(SRCS))
$(info OBJS = $(OBJS))
$(info INCLUDES = $(INCLUDES))


obj/%.o : src/%.c $(INCLUDES)
        @echo "building $< -> $@"
        mkdir -p $(dir $@)
        $(CC) -o $@ -c -g $< $(CFLAGS) $(patsubst %,-I %,$(dir $(INCLUDES)))

all:$(OBJS)
        @echo "building $@"
        $(CC) -o $(EXE) $(OBJS) $(CFLAGS)
  

Я не уверен, что вы пытаетесь сделать ACompiler в своем примере, но это не сработает — вы не можете установить переменную в одной строке рецепта и прочитать ее в следующей (плюс вы используете := для назначения переменной, которая не является законным синтаксисом bash). Я думаю, вы пытаетесь выяснить $(dir $<) — каталог исходного файла.

Ответ №2:

GNU Make имеет встроенные рецепты для сборки .o из .c и исполняемого файла из объектных файлов. Этой строки достаточно для выполнения в основном того, что вы хотите:

 SimulateurCompile: $(patsubst %.c, %.o, $(wildcard src/*/*))
  

Это приведет к размещению .o-files рядом с исходными файлами. Я бы скорее рекомендовал использовать что-то другое, кроме Make, чем возиться с папками объектов, такими как Meson или SCons.

Встроенные рецепты используют переменные, которые вы можете задать, такие как CFLAGS и CPPFLAGS. Подробности о встроенных рецептах см. в документации.