Makefile有时会忽略配方中的变量

时间:2011-05-24 10:25:25

标签: 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

但它(正如我的意图)在之前的所有行中都是如此。谁能解释我这种行为?谢谢。

编辑:当我在“%.o”目标中省略“%。h”时,不会发生错误。

1 个答案:

答案 0 :(得分:3)

我要走出困境,并猜测没有sc_application_1.h,但 是每个以前来源的头文件(例如Scheduler.hconsumer_wrapper.h ...)。

如果没有%.o: %.cpp %.h,则您的%.h规则不适用,因此Make会回退到默认规则,该规则不使用LIB_INC。解决此问题的最简单方法是添加另一个%.o规则:

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

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