Было несколько вопросов об удалении круговых зависимостей при запуске Makefile (здесь и здесь), однако я все еще немного не понимаю, почему они происходят.
Например, я пытаюсь скомпилировать программу с графическим интерфейсом Win32, содержащую файлы ресурсов (из этого руководства а>). Эти файлы ресурсов компилируются в объектные файлы с помощью команды windres
, поэтому их можно связать с окончательным исполняемым файлом (как описано здесь):
CC = gcc
CFLAGS = -mwindows
DEPS = resource.h
OBJ = menu_one.o $(patsubst %.rc,%.rc.o,$(wildcard *.rc))
all: menu_one
%.rc.o: %.rc
windres $^ -o $@
%.o: %.c $(DEPS)
$(CC) -c $< -o $@ $(CFLAGS)
menu_one: $(OBJ)
$(CC) $^ -o $@ $(CFLAGS)
Команда $(patsubst %.rc,%.rc.o,$(wildcard *.rc))
берет все файлы ресурсов, оканчивающиеся на .rc
, и добавляет к ним расширение .o
(например, resource.rc.o
).
Когда я запускаю это, кажется, что все работает, и я получаю работающий исполняемый файл, однако Make выводит следующее:
gcc -c menu_one.c -o menu_one.o -mwindows
make: Circular menu_one.rc <- menu_one.rc.o dependency dropped.
windres menu_one.rc -o menu_one.rc.o
gcc menu_one.o menu_one.rc.o -o menu_one -mwindows
Возникает ли эта циклическая зависимость из-за того, что технически у меня есть два правила .o
? Другими словами, как исправить эту циклическую зависимость?
Редактировать 1:
Однако я попытался следовать тому, что сказал @MadScientist: это по-прежнему создавало циклическую зависимость с Make. Еще немного погуглив, я наткнулся на следующую страницу . В самом низу находится раздел "Зависимости циклических файлов". Это заставило меня задуматься о выводе Make:
make: Circular menu_one.rc <- menu_one.rc.o dependency dropped.
Похоже, что суффикс rc
создает эту зависимость, даже если он не является частью расширения файла выходного объектного файла (т.е. file.rc.o
). Если я изменю суффикс выходного файла на .res.o
, циклическая зависимость полностью исчезнет:
...
RESOBJ = $(patsubst %.rc,%.res.o,$(wildcard *.rc))
OBJ = menu_one.o $(RESOBJ)
...
%.res.o: %.rc
windres $^ -o $@
...
Возникает очень похожий вопрос: если бы я хотел использовать предыдущий суффикс .rc.o
, как бы вы это сделали? Возможно ли это?
Редактировать 2:
@MadScientist предлагает использовать правило соответствия чему угодно отлично помогло решить проблему. Теперь это позволяет мне использовать окончание суффикса .rc.o
. См. @MadScientist обновленный ответ ниже.