LINUX.ORG.RU

Помогите разобрать Makefile

 ,


0

1

Лет 10 уже не писал Makefile-ы, не могу понять, в чем собака порылась.

#!/usr/bin/make -f
CC := gcc

ifeq ($(CC),icc)
  CFLAGS += -qopenmp
endif

ifeq ($(CC),gcc)
  CFLAGS += -fopenmp
endif

CFLAGS += -I../include -lsrvc_cmd

TARGETS = $(patsubst %.c,%,$(wildcard *.c))

BINARY= $(patsubst %.c,%,$<)

install:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	@for bin in $(TARGETS); do (make $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

$(BINARY): $(BINARY)
	$(CC) $(CFLAGS) -o $@ $@.o

clean:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

cleanall:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

.PHONY: build clean clean all

Проблема в том, что в итоге прога не может быть слинкована с библиотекой srvc_cmd, не находится нужный символ. Полагаю, что причина в том, библиотека указывается до файла с текстом, типа:

gcc -fopenmp -I../include -lsrvc_cmd prog.c -o prog

Ответ на: комментарий от zloy_starper

Надо же указывать, что пробовали, а что нет. $(BINARY) это что-то левое. Так, вроде, работает (*.exe цели фиктивные, %: не срабатывает):

CC := gcc

ifeq ($(CC),icc)
  CFLAGS += -qopenmp
endif

ifeq ($(CC),gcc)
  CFLAGS += -fopenmp
endif

CFLAGS += -I../include -lsrvc_cmd

TARGETS = $(patsubst %.c,%,$(wildcard *.c))

install:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	@for bin in $(TARGETS); do (make $$bin.exe); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

%.exe: %.c
	$(CC) -o $* $^ $(CFLAGS)

clean:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

cleanall:
	@for bin in $(TARGETS); do (rm -if $$bin); done
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

.PHONY: build clean clean all

Вызывать make повторно конечно не очень, но не стал это менять, чтобы изменений было мало.

xaizek ★★★★★ ()
BINARY= $(patsubst %.c,%,$<)
$(BINARY): $(BINARY)
	$(CC) $(CFLAGS) -o $@ $@.o

Что это такое? Сам придумал? Это правило никогда не сработает.

У тебя срабатывает встренное в сам make правило, которое сработает даже при отсутствуещим Makefile.

anonymous ()
Ответ на: комментарий от zloy_starper

Нет, конечно, иначе бы и не спрашивал.

Зачем ты сперва заходишь болото, потом просишь вытащить тебя из него? Сам залез, сам и выбирайся.
Хочешь, чтоб помогли, приведи первоначальный рабочий мейкфайл. И скажи, что в нем хочешь изменить под себя.

anonymous ()

Полагаю, что причина в том, библиотека указывается до файла с текстом

Именно. Давным давно в линкерах по умолчанию включено --as-needed.

akk ★★★★ ()