Основная проблема заключается в том, что вы нигде не находитесь сообщают, что ваши исходные файлы. Начните делать это:
SOURCEDIR=/home/test/project/sources
SOURCES=$(wildcard $(SOURCEDIR)/*.c)
Затем вывести имена объектных файлов из имен исходных файлов путем замены .c
для .o
:
OBJECTDIR=/home/test/project/objects
OBJECTS=$(patsubst $(SOURCEDIR)/%.c,$(OBJECTDIR)/%.o,$(SOURCES))
Вы все еще можете сохранить общие правила для создания объектных файлов:
$(OBJECTDIR)/%.o: $(SOURCEDIR)/%.c
$(CC) -fPIC -c $^ -o [email protected]
Но вы даете явный список объектных файлов в правила, чтобы сделать sharedlib
:
libsharedlib.so: $(OBJECTS)
$(CC) -shared -o [email protected] $<
Обратите внимание, что я сделал имя правила таким же, как и файл, который создается. Это важно, потому что вызов, сделанный дважды подряд, затем пропустит создание библиотеки во второй раз. Вы всегда можете добавить псевдоним, если вы хотите:
sharedlib: libsharedlib.so
В этом случае, это также хорошо, чтобы сказать, сделать что sharedlib
не реальный файл:
.PHONY sharedlib
Это предотвращает странные вещи случиться если вы в каталоге всегда был файл sharedlib
.
Но подстановочные означало бы, что я скомпилировать все файлы сразу? – Bionix1441
Я изменил его, но все тот же вопрос. – Bionix1441
Вы пытаетесь скомпилировать libsharedlib.so со всеми объектами сразу? – 2501