Makefile с файлами в разных папках - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок в make-файлах и пытаюсь написать файл, который компилирует файлы из разных папок.Вы можете увидеть распределение моих файлов в выводе команды дерева, которую я добавил к сообщению: я хочу, чтобы мои заголовочные файлы были в папке include, некоторые библиотечные файлы в srclib, мои основные исходные файлы в src и сгенерированные .o в lib.Для начала я попробовал рекурсивные make-файлы, но не могу скомпилировать tcp.c, потому что компилятор не может найти tcp.h, я застрял.

Команда выходного дерева

.
|-- includes
|   `-- tcp.h
|-- lib
|-- makefile
|-- src
|   |-- cliente.c
|   `-- servidor_preforked.c
`-- srclib
    `-- tcp.c

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Да, вы можете явно добавлять имена папок к целям и командам как @bruno, но это немного похоже на жесткое кодирование, плюс добавляет немного дублирования.Чтобы улучшить это, используйте VPATH или vpath-функцию , которая подходит для этого случая:

vpath %.h includes
vpath %.c src:srclib
vpath %.o lib

Указывает, в каком каталоге искать файлы определенного типа.Для файлов .c он будет искать как «src», так и «srclib».

Теперь правила могут выглядеть проще:

cliente.o : cliente.c tcp.h
    $(GCC) -c -o lib/$@  -I includes $<

Обратите внимание на использование $@ и $< автоматические переменные .В этом случае $< расширится до первого необходимого пути с каталогом - "lib / cliente.c", а $@ будет просто именем цели - "cliente.o".

Если вы напишитеправила так, что вы можете в конечном итоге, что все ваши правила выглядят одинаково, и подумать о рефакторинге его дальше, чтобы просто одно неявное правило шаблона %.o: %.c.

0 голосов
/ 23 февраля 2019

вам нужно указать, где найти заголовок для вашего компилятора, для gcc это делается с опцией -I

Например, если вы производите a.out в lib ваш make-файл может быть:

lib/a.out:
    gcc -o lib/a.out -I includes srclib/tcp.c src/cliente.c src/servidor_preforked.c

Чтобы также создавать объекты в lib :

all::lib/a.out

GCC = gcc -ansi -pedantic -Wextra

lib/tcp.o : srclib/tcp.c includes/tcp.h
    $(GCC) -c -o lib/tcp.o  -I includes srclib/tcp.c

lib/cliente.o : src/cliente.c includes/tcp.h
    $(GCC) -c -o lib/cliente.o  -I includes src/cliente.c

lib/servidor_preforked.o : src/servidor_preforked.c includes/tcp.h
    $(GCC) -c -o lib/servidor_preforked.o  -I includes src/servidor_preforked.c

lib/a.out : lib/tcp.o lib/cliente.o lib/servidor_preforked.o
    $(GCC) -o lib/a.out -I includes lib/tcp.o lib/cliente.o lib/servidor_preforked.o

Пример:

pi@raspberrypi:/tmp/d $ rm lib/*
pi@raspberrypi:/tmp/d $ make
gcc -ansi -pedantic -Wextra -c -o lib/tcp.o  -I includes srclib/tcp.c
gcc -ansi -pedantic -Wextra -c -o lib/cliente.o  -I includes src/cliente.c
gcc -ansi -pedantic -Wextra -c -o lib/servidor_preforked.o  -I includes src/servidor_preforked.c
gcc -ansi -pedantic -Wextra -o lib/a.out -I includes lib/tcp.o lib/cliente.o lib/servidor_preforked.o
pi@raspberrypi:/tmp/d $ ls -l lib
total 24
-rwxr-xr-x 1 pi pi 8208 févr. 23 18:15 a.out
-rw-r--r-- 1 pi pi  956 févr. 23 18:15 cliente.o
-rw-r--r-- 1 pi pi  856 févr. 23 18:15 servidor_preforked.o
-rw-r--r-- 1 pi pi  840 févr. 23 18:15 tcp.o
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...