#c #linux #makefile #gnu
#c #linux #makefile #гну
Вопрос:
Основываясь на имени общей библиотеки, я хотел бы автоматически определить, какие SRC включить в рецепт создания.
SHARED_LIBS := libc.so
libd.so
libc.so,SRCS := a.o
b.o
libc.so,DEPS := -lc
libd.so,SRCS := e.o
f.o
libd.so,DEPS := -lc
all: $(SHARED_LIBS)
.PHONY: all
%.o: %.c
$(CC) -c $^ -o $@
%.so: $($*.so,SRCS)
$(CC) $(CFLAGS) $(SFLAGS) -o $@ $^ $($*,DEPS)
Комментарии:
1. Не могли бы вы, пожалуйста, выразиться немного конкретнее? Как этот makefile связан с вопросом? Каков предполагаемый результат этого makefile?
2. Похоже, вы имеете в виду конкретное соглашение об именовании библиотек; если вы расскажете нам, что это такое, возможно, мы сможем вам что-то посоветовать.
3. В основном там, где вы видите%.так что в настоящее время мне нужно использовать $ (libc.so , SRCS) или $ (libd.so , SRCS), но я бы хотел, чтобы он автоматически захватывал те, которые основаны на имени общей библиотеки.
Ответ №1:
То, что у вас есть, ПОЧТИ работает: DEPS будет работать (если вы используете правильное имя).
Просто для ясности я переименовываю библиотеку, потому что вам определенно не следует создавать библиотеку с именем libc
.
Если вы можете отказаться от идеи, что список объектов должен быть в переменной, и вместо этого объявлять их напрямую, вы можете довольно легко делать то, что хотите:
SHARED_LIBS := libfoo.so
all: $(SHARED_LIBS)
.PHONY: all
libfoo.so: a.o
b.o
libfoo,DEPS := -lc
%.o: %.c
$(CC) -c $^ -o $@
%.so:
$(CC) $(CFLAGS) $(SFLAGS) -o $@ $^ $($*,DEPS)
должен это сделать. Конечно, вам не нужно явно добавлять -lc
в свою строку ссылки, и вам, вероятно, не следует этого делать. Но, по-видимому, у вас есть другие библиотеки, которые вы хотите добавить.
Если вы действительно хотите, чтобы объекты также хранились в переменной, тогда вам нужно сделать что-то более необычное.
Комментарии:
1. Похоже, это не работает. Я вижу сгенерированные файлы .o, но не вижу libfoo.so сгенерированный.
2. Потребовалось одно незначительное изменение (переместить
all
цель), но оно все равно будет собиратьсяlibfoo.so
. Извините, но если вы используете приведенный выше makefile и запуститеmake
, то поведение, о котором вы сообщаете (libfoo.so
не генерируется), не может произойти, поэтому в вашей среде должен быть какой-то другой аспект, который вы здесь не описали. Вы можете попробовать запуститьmake -d
и изучить (объемный) вывод, чтобы определить, как make решает обработатьlibfoo.so
цель.3. Я знаю, что вопрос включал
%.o: %.c
правило, но это на самом деле не нужно, не так ли?4. Это не требуется, если встроенного правила достаточно для их целей, нет.