#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
orfolder1
или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. Подробности о встроенных рецептах см. в документации.