Как сделать Makefile Найти все .c файлы в каталоге, а затем создать объектные файлы для каждого отдельного файла? - PullRequest
0 голосов
/ 22 мая 2018

Как заставить make-файл найти все файлы .c в каталоге с именем lib, а затем создать отдельные объектные файлы для каждого файла .c (в gcc)?Скажем, в каталоге lib было два файла, foo.c и bar.c, как мне заставить make-файл обнаруживать все файлы .c в каталоге, а затем создавать объектные файлы (в данном случае foo.o и bar.o)для них в каталоге сборки?

1 Ответ

0 голосов
/ 22 мая 2018

Я предполагаю, что вы используете (в частности) GNU make (и я полагаю, что вы работаете в какой-то системе POSIX, возможно, в Linux).Потратьте несколько часов, чтобы прочитал документацию .

Тогда у вас может быть

 SRCFILES:= $(wildcard */*.c)

(вы можете использовать = вместо := и вам следует прочитать документацию о различиях между ними) или, возможно (конечно, вам следует избегать странных символов, таких как пробелы в путях к файлам)

 SRCFILES:= $(shell find -type f -name '*.c')

Возможно, вы захотите определить

 OBJFILES:= $(patsubst %.c,%.o,$(SRCFILES))

Кстати, для небольших проектов с несколькими десятками тысяч строк исходного кода, удобнее иметь плоское дерево исходных кодов .См. этот ответ.Ищите также вдохновение в Makefile существующих свободных программ проектов, например, на github .

Я не уверен, что для вашего небольшого проекта, установкаобъектные файлы в отдельном каталоге имеют смысл.

Узнайте о встроенных правилах make, изучив вывод make -p

Когда через несколько лет ваш проект станет значительнобольше, вы могли бы занять некоторое время, чтобы реорганизовать это и улучшить сборку.

1038 * Читайте также Рекурсивные Сделать считаются вредными (мнение есть, возможно, спорно, но, конечно, интересно)

Попробуйте использовать make --trace и / или remake с -x для отладки Makefile

Возможно, вы (ноМне не нравится это для небольших проектов ...) сгенерируйте Makefile (например, используя autoconf или cmake ) или используйте какой-нибудь другой инструмент для автоматизации сборки , например ниндзя (возможно, с мезон ).

Кстати, если lib/ содержатs код для некоторой библиотеки, читайте Как программировать библиотеку и Как писать общие библиотеки .

Поскольку выиспользуя GCC через make, прочитайте также главу о Вызов GCC

...