Я проголосовал за ответ Бантэра, но, на мой взгляд, хотел бы упомянуть, что использование замещения для ваших объектных файлов сделает ваш Makefile менее подверженным ошибкам.
Например:
SRCS_L = a.c b.c c.c
OBJS_L = $(SRCS_L:.c=.o)
OBJS_L всегда будет списком объектных файлов для источников, определенных в SRCS_L.
Для проблемы -lpthread:
Ссылка только на библиотеки, когдасоздание вашего исполняемого файла.
Оригинал:
$(CC) $(FLAGS) $(SRCS_R) -lpthread lib.a
$(OBJS_R) -o $(PROG)
Исправлено:
$(CC) $(FLAGS) $(SRCS_R) lib.a
$(CC) -lpthread $(LIBRARY) $(OBJS_R) -o $(PROG)
Также я настоятельно рекомендую разделить ваш исполняемый файл и библиотеку на отдельные файлы Makefile.Это позволит вам более легко перемещать и повторно использовать вашу библиотеку и упростить логику ваших Makefile.
Например:
LIBRARY=my_lib.a
CC=gcc
SOURCES=$(wildcard *.c)
OBJECTS=$(SOURCES:.c=.o)
CFLAGS=-c -g -Wall
build: $(OBJECTS)
ar rcs $(LIBRARY) $(OBJECTS)
clean:
rm -rf $(LIBRARY) $(OBJECTS)
rebuild: clean build
$(OBJECTS):
$(CC) $(CFLAGS) $(@:.o=.c) -o $@
Использование библиотеки Makefile для вашей библиотеки, как указано выше, означаетчто вам не нужно редактировать Makefile всякий раз, когда вы добавляете или удаляете исходный файл.Однако обратите внимание, что вам нужно выделить отдельный каталог для вашей библиотеки, чтобы такие файлы Makefile работали должным образом.