Makefile для подкаталогов программы на C - PullRequest
0 голосов
/ 30 апреля 2018

У меня проблема с созданием Makefile для моей программы. Прежде всего я укажу, как должен выглядеть каталог моей программы:

  • *. O файлы должны находиться в главном каталоге программы
  • *. C файлы находятся в каталоге src
  • *. H файлы находятся в каталоге include
  • Папка bin предназначена для исполняемого файла
  • Папка lib - это место для файлов библиотеки

Как я упоминал выше, у меня есть файлы * .c * .h, уже помещенные в src и включающие каталоги. Makefile находится в главном каталоге программы. Мой make-файл должен содержать vpath или VPATH. Используя gcc, я должен собрать весь проект. pj, pp, pg, pr являются функциями .c файлов. Прежде всего я должен создать объектные файлы, используя gcc -fPIC -c, а не из pj.o и pp.o. Мне нужно создать статическую библиотеку, используя ar rs, а затем создать общую библиотеку из pg.o и pr.o, используя gcc -shared. Все libjp.a и libhgr.so должны быть помещены в папку lib. После этого мне нужно собрать всю программу, используя gcc -o $@ $^ -L./lib -I./include и поместить исполняемый файл в каталог bin. Это на самом деле не работает, это только сборка первой библиотеки - libjp.a Вот мой make-файл:

.PHONY: clean
.SUFFIXES: .c .o .a .so
vpath %.c src
vpath %.h include
%.o: %.c
    gcc -w -fPIC -c $<
lib/libjp.a: pj.o pp.o
    ar rs $@ $<
lib/libgr.so: pg.o pr.o
    gcc -w -shared -o $@ $<
%: %.o
    gcc -o $@ $^ -L./lib -I./include
program: program.o lib/libjp.a lib/libgr.so
program.o: program.c libjp.h libgr.h
pj.o: pj.c
pp.o: pp.c
pg.o: pg.c
pr.o: pr.c
clean:
    rm -f program *.o *.a *.so

Спасибо за ваше время и помощь:)

1 Ответ

0 голосов
/ 30 апреля 2018

Вы не можете использовать VPATH для поиска производных (сгенерированных) файлов. VPATH может только использоваться с исходными файлами. Таким образом, эти две линии и вся связанная с ними инфраструктура не будут работать так, как вы ожидаете:

vpath %.so lib
vpath %.a lib

Если вы хотите понять это более полно, вы можете прочитать http://make.mad -scientist.net / paper / how-not-to-use-vpath /

Во-вторых, такие правила:

%.a: pj.o pp.o
        ar rs $@ $^
        mv *.a ./lib

нарушает второе правило make-файлов . Если вы хотите, чтобы цель была создана в подкаталоге, тогда имя цели должно быть полным именем в подкаталоге. И нет смысла использовать правила шаблона, если вы собираетесь явно перечислить предпосылки в шаблоне. Вы можете использовать что-то вроде:

lib/libjp.a: pj.o pp.o
        ar rs $@ $^
lib/libgr.so: pg.o pr.o
        gcc -w -shared -o $@ $^

, что означает, что вы должны изменить ссылки на него:

program: program.o lib/libjp.a lib/libgr.so

и подобные строки должны быть удалены:

libjp.a: pj.o pp.o
libgr.so: pg.o pr.o

Возможны другие подобные изменения.

...