Makefile понякога игнорира променливата в рецептата

Имам следния 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".


person simon    schedule 24.05.2011    source източник


Отговори (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)
person Beta    schedule 24.05.2011
comment
Благодаря ви много, това наистина беше проблемът. - person simon; 24.05.2011
comment
Това ще бъде ли кандидат за предпоставка само за поръчка? - person Teeeeeeeeeeeeeeeeeeeeeeeeeeeej; 18.12.2015