Одно правило не запускается на этом Makefile

Я запускаю этот make-файл в WinXP:

Package=killerapp

Sources=main.c
Resource=resource\resource.rc

Objs=$(Sources:.c=.o)
Res_obj=$(notdir $(Resource:.rc=.o))

CC_RES=windres
CC=gcc

CFLAGS=
LDFLAGS=-mwindows

%.o.c:
    $(CC) $(CFLAGS) -c $<

$(Res_obj): $(Resource)
    $(CC_RES) $< -o $@

$(Package): $(Objs) $(Res_obj)
    $(CC) $(LDFLAGS) $^ -o $@

all:
    $(MAKE) $(Package)

clean:
    @del $(Objs)
    @del $(Res_obj)
    @del $(Package).exe

Моя идея состоит в том, чтобы сначала скомпилировать файл ресурсов, а затем исходные файлы, но кажется, что запускается только windres, а исходные файлы не компилируются, есть идеи?

Обновлено #1: эта работа, как ожидалось.

Package=killerapp

Sources=main.c
Resource=resource\resource.rc

Objs=$(Sources:.c=.o)
Res_obj=$(notdir $(Resource:.rc=.o))

CC_RES=windres
CC=gcc

CFLAGS=-O2 -Wall -Werror
LDFLAGS=-mwindows

all: $(Package)

%.o: %.c
    $(CC) $(CFLAGS) -c $<

$(Res_obj): $(Resource)
    $(CC_RES) $< -o $@

$(Package): $(Res_obj) $(Objs)
    $(CC) $(LDFLAGS) $^ -o $@

clean:
    @del $(Objs)
    @del $(Res_obj)
    @del $(Package).exe

run: $(Package)
    ./$^

1 ответ

Решение

Общее правило неверно. Для Gnu make используйте:

%.o: %.c Makefile
    $(CC) $(CFLAGS) -c $<

Вы также должны заменить all цель (команда не требуется):

all: $(Package)

И поместите его перед любыми другими целевыми правилами, чтобы сделать его целью по умолчанию.

Я также предлагаю вам включить предупреждения компилятора для обнаружения распространенных ошибок программирования:

CFLAGS=-O2 -Wall -Werror
Другие вопросы по тегам