Сборка нескольких общих библиотек с одним Makefile

0

Я пытаюсь создать несколько разделяемых библиотек в одном файле makefile. Это то, что я использую для создания одной общей библиотеки:

CC = gcc # C compiler
PWD := $(shell pwd)
CFLAGS = -fPIC -Wall -Wextra -O2 -g # C flags
LDFLAGS = -shared  # linking flags

RM = rm -f  # rm command

CFLAGS += $(DFLAGS)

TARGET_LIB := lib1.so # target lib
#TARGET_LIB += lib2.so

SRCS := lib1.c # source files
#SRCS += lib2.c # source files

OBJS = $(SRCS:.c=.o)

.PHONY: all
all: $(TARGET_LIB)

$(TARGET_LIB): $(OBJS)
    $(CC) $(INC) $(LDFLAGS) $(CFLAGS) -o $@ $^

Тем не менее, я не могу просто раскомментировать строки для lib2 и создать его. Скорее всего, потому что $(TARGET_LIB): $(OBJS) расширяется до lib1.so lib2.so: lib1.o lib2.o чего я не хочу.

Вместо этого я хочу что-то вроде

lib1.so : lib1.o

lib2.so : lib2.o

Но я не уверен, как это сделать или что он называется. Может кто-нибудь сказать мне, что делать, чтобы добиться того, что я ищу?

EDIT: Я должен был быть более ясным. Я понимаю, что вы можете добавить больше целей для их создания. Но есть ли способ сделать это без необходимости писать новую цель каждый раз, когда я хочу добавить новую библиотеку?

Благодарю.

  • 0
    переменная make $ (INC) не определена, поэтому библиотеки (* вероятно) будут скомпилированы неправильно.
Теги:
makefile

4 ответа

2
Лучший ответ

Вы можете сделать что-то вроде этого -

все: lib1.so lib2.so

и предоставить правила для создания lib1.so и lib2.so

0

Для этого подразумеваются неявные правила. Читайте о них в руководстве GNU.

замещать

$(TARGET_LIB): $(OBJS)

с

%.so: %.c
0

Вы можете разделить источники двух библиотек на разные каталоги. Это также может помочь в дальнейшем обслуживании ваших библиотек. Затем используйте один файл make, который вызывает соответствующие суб файлы. Я могу быть лучше, чем один большой файл makefile

0

Вы можете сделать это, разделив цели следующим образом:

CC = gcc # C compiler
PWD := $(shell pwd)
CFLAGS = -fPIC -Wall -Wextra -O2 -g # C flags
LDFLAGS = -shared  # linking flags

RM = rm -f  # rm command

CFLAGS += $(DFLAGS)


TARGET_LIB1 = lib1.so # target lib
TARGET_LIB2 = lib2.so
TARGET_LIBS = $(TARGET_LIB1) $(TARGET_LIB2)

SRCS1 = lib1.c # source files
SRCS2 = lib2.c # source files
SRCS = $(SRCS1) $(SRCS2) 

OBJS1 = $(SRCS1:.c=.o)
OBJS2 = $(SRCS2:.c=.o)
OBJS = $(OBJS1) $(OBJS2)

.PHONY: all
all: $(TARGET_LIBS)

$(TARGET_LIB1): $(OBJS1)
    $(CC) $(INC) $(LDFLAGS) $(CFLAGS) -o $@ $^

$(TARGET_LIB2): $(OBJS2)
    $(CC) $(INC) $(LDFLAGS) $(CFLAGS) -o $@ $^
  • 0
    TARGET_LIB не определен, поэтому предложенный файл make не будет работать. $ (INC) не определен, поэтому исходные файлы (вероятно) не будут компилироваться правильно.
  • 1
    Я закончил make-файл, я подумал, что было очевидно, что это не полностью скомпилированный make-файл, а только для того, чтобы показать, как это сделать. $ (INC) был использован, но не определен в исходном make-файле. но это не ошибка! это просто пустая переменная. В makefile вы можете передавать аргументы из другого makefile, включая текущий, так что он также может быть объявлен в другом месте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню