Makefile иногда игнорирует переменную в рецепте

#makefile #gnu-make

#makefile #gnu-make

Вопрос:

У меня есть следующий Makefile

 CXX = g  
CXXFLAGS = -g -Wall
COMPILE = ${CXX} ${CXXFLAGS} -c
LINK = ${CXX} -lpthread
LIB_INC = -Ilib -Iwrappers -Iprocesses

src := $(wildcard lib/*.cpp) $(wildcard wrappers/*.cpp)
obj = $(src:.cpp=.o)

src_1 := processnetwork_part001.cpp sc_application_1.cpp
obj_1 = $(src_1:.cpp=.o)
src_2 := processnetwork_part002.cpp sc_application_2.cpp
obj_2 = $(src_2:.cpp=.o)

all : sc_application_1 sc_application_2
.PHONY : all

sc_application_1 : ${obj} ${obj_1}
    ${LINK} -o sc_application_1 $(obj) ${obj_1}

sc_application_2 : ${obj} ${obj_2}
    ${LINK} -o sc_application_2 $(obj) ${obj_2}

%.o : %.cpp %.h
    ${COMPILE} -o $@ $< $(LIB_INC)

clean :
    rm sc_application_1 sc_application_2 ${obj} ${obj_1} ${obj_2}
  

Где lib, оболочки и процессы являются подкаталогами каталога, в котором хранятся Makefile и два основных приложения sc_application_1 и sc_application_2. Когда я запускаю make, я получаю следующий вывод (только последние несколько строк без предупреждений компилятора).

 g   -g -Wall -c -o lib/Scheduler.o lib/Scheduler.cpp -Ilib -Iwrappers -Iprocesses
g   -g -Wall -c -o wrappers/consumer_wrapper.o wrappers/consumer_wrapper.cpp -Ilib -Iwrappers -Iprocesses
g   -g -Wall -c -o wrappers/generator_wrapper.o wrappers/generator_wrapper.cpp -Ilib -Iwrappers -Iprocesses
g   -g -Wall -c -o wrappers/square_wrapper.o wrappers/square_wrapper.cpp -Ilib -Iwrappers -Iprocesses
g   -g -Wall -c -o processnetwork_part001.o processnetwork_part001.cpp -Ilib -Iwrappers -Iprocesses
g   -g -Wall   -c -o sc_application_1.o sc_application_1.cpp
In file included from wrappers/wrappers.h:4:0,
                 from sc_application_1.cpp:10:
wrappers/generator_wrapper.h:4:28: fatal error: ProcessWrapper.h: No such file or directory
compilation terminated.
make: *** [sc_application_1.o] Error 1
  

Компиляция завершается неудачно, потому что по какой-то причине, которую я не понимаю, переменная LIB_INC больше не добавляется в

 g   -g -Wall   -c -o sc_application_1.o sc_application_1.cpp
  

Но это (как я и предполагал) во всех предыдущих строках. Кто-нибудь может объяснить мне это поведение? Спасибо.

редактировать: ошибка не возникает, когда я опускаю «%.h» в целевом объекте «%.o».

Ответ №1:

Я собираюсь рискнуть и предположить, что нет sc_application_1.h , но есть файл заголовка для каждого предыдущего источника (например, Scheduler.h , consumer_wrapper.h …).

Ваше %.o: %.cpp %.h правило не применяется, если ее нет %.h , поэтому Make возвращается к своему правилу по умолчанию, которое не использует LIB_INC . Самый простой способ исправить это — добавить другое %.o правило:

 %.o : %.cpp %.h
    ${COMPILE} -o $@ $< $(LIB_INC)

%.o : %.cpp
    ${COMPILE} -o $@ $< $(LIB_INC)
  

Комментарии:

1. Большое вам спасибо, это действительно была проблема.

2. Будет ли это кандидатом на обязательное условие только для заказа?