Как скомпилировать с Makefile в подкаталогах? - PullRequest
0 голосов
/ 03 апреля 2011

Для школьного проекта мне нужно создать Makefile, который компилирует подкаталоги без использования других Makefile. Я имею в виду, что мне не разрешено делать это:

make -C <sub-folder>

Вот как это выглядит:

На местном:

   ./Makefile
   ./sub
   ./sub2

А в подкаталоге:

   ./sub/file1.c
   ./sub/file2.c
   ./sub/file3.c
   ./sub/file4.c

   ./sub2/file1.c
   ./sub2/file2.c
   ./sub2/file3.c
   ./sub2/file4.c

Вот что я сделал до сих пор, но я продолжаю получать ошибки:

CC              =       gcc -W -Wall -Werror

NAME            =       test

NAME2           =       test2

SRCS            =       sub/file1.c            \
                        sub/file2.c            \
                        sub/file3.c            \
                        sub/file4.c

SRCS2           =      sub2/file1.c            \
                        sub2/file2.c            \
                        sub2/file3.c            \
                        sub2/file4.c

OBJS            =       $(SRCS:.c=.o)

OBJS2           =       $(SRCS2:.c=.o)

all:
    $(OBJS)
    $(CC) $(OBJS) -o $(NAME)

    $(OBJS2)
    $(CC) $(OBJS2) -o $(NAME2)                                                                          

Спасибо, Еписмен.

[ПРАВИТЬ] Отредактировал мою проблему Моя проблема немного изменилась. Мне нужно скомпилировать в один и тот же Makefile, всегда с одинаковыми правилами, два разных бинарных файла. Я попытался следовать тому, что сработало для одного, но, похоже, не сработало для двоих. Если у вас есть какие-либо советы, пожалуйста, дайте мне знать.

Отправленный код работает, но компилирует только первый двоичный файл.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

См. Эту статью:

Учебник по Make: Как написать Makefile

Это объясняет все, в том числе, почему не использовать рекурсивное make и как вместо этого использовать include.

Вам особенно захочется прочитать: Рекурсивное создание считается вредным , которое объясняет, почему рекурсивное создание является плохим, и методы его предотвращения.

1 голос
/ 03 апреля 2011

Используйте следующее (не забудьте поставить пробелы вместо пробелов в начале строк):

all: $(NAME) $(NAME2)

$(NAME): $(OBJS)
    $(CC) $(OBJS) -o $(NAME)

$(NAME2): $(OBJS2)
    $(CC) $(OBJS2) -o $(NAME2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...