0

我想在单个 Makefile 中使用宏来编译两个程序。当我运行 make 时,它​​会产生以下输出:

Makefile:27: warning: overriding commands for target `compose'
Makefile:24: warning: ignoring old commands for target `compose'
g++ -g `Magick++-config --cppflags` -c alphamask.cpp
g++ -g `Magick++-config --ldflags` -o alphamask alphamask.o -L /usr/lib64/ -lglut -lGL -lGLU -lMagick++ -lm

它只编译第二个程序。有没有办法让宏编译两个程序?这是我当前的 Makefile:

CC      = g++
C       = cpp

CFLAGS      = -g `Magick++-config --cppflags`
LFLAGS      = -g `Magick++-config --ldflags`

ifeq ("$(shell uname)", "Darwin")
  LDFLAGS     = -framework Foundation -framework GLUT -framework OpenGL -lMagick++ -lm
else
  ifeq ("$(shell uname)", "Linux")
    LDFLAGS     = -L /usr/lib64/ -lglut -lGL -lGLU -lMagick++ -lm
  endif
endif

ALPHA       = alphamask
COMP = compose 

${ALPHA}:   ${ALPHA}.o
    ${CC} ${LFLAGS} -o ${ALPHA} ${ALPHA}.o ${LDFLAGS}

${ALPHA}.o: ${ALPHA}.${C}
    ${CC} ${CFLAGS} -c ${ALPHA}.${C}

${COMP}:    ${COMP}.o
    ${CC} ${LFLAGS} -o ${COMP} ${COMP}.o ${LDFLAGS}

${COMP}.o:  ${COMP}.${C}
    ${CC} ${CFLAGS} -c ${COMP}.${C}


run:
    ./alphamask dhouse.png
    ./compose alphamask.png


clean:
    rm -f core.* *.o *~ ${ALPHA} ${COMP}
4

2 回答 2

2

第一个问题:

COMP = compose 

${COMP}.o: ...

在 Make 中为变量添加后缀并不是那么简单。在这种情况下,您会遇到一些空白问题,这就是您收到警告消息的原因,以及compose即使您尝试过也无法构建的原因。

既然你是初学者,那我们就用一个简单的方法,粗略但有效。我们将重写这些规则,并在顶部添加一个,以便您可以使用以下命令构建两个文件make

all: alphamask compose

alphamask: alphamask.o
    ${CC} ${LFLAGS} -o alphamask alphamask.o ${LDFLAGS}

alphamask.o: alphamask.cpp
    ${CC} ${CFLAGS} -c alphamask.cpp

compose: compose.o
    ${CC} ${LFLAGS} -o compose compose.o ${LDFLAGS}

compose.o: compose.cpp
    ${CC} ${CFLAGS} -c compose.cpp

在你完美地完成这个工作之后,可以进行很多改进。

编辑:

现在它运行良好,我们可以改进它。首先让我们放入自动变量,以减少冗余:$@是目标的名称,$^是先决条件,$<是第一个先决条件。

all: alphamask compose

alphamask: alphamask.o
    ${CC} ${LFLAGS} -o $@ $^ ${LDFLAGS}

alphamask.o: alphamask.cpp
    ${CC} ${CFLAGS} -c $<

compose: compose.o
    ${CC} ${LFLAGS} -o $@ $^ ${LDFLAGS}

compose.o: compose.cpp
    ${CC} ${CFLAGS} -c $<

现在我们看到命令中有冗余,所以我们可以组合规则:

all: alphamask compose

alphamask: alphamask.o

compose: compose.o

alphamask compose:
    ${CC} ${LFLAGS} -o $@ $^ ${LDFLAGS}

alphamask.o: alphamask.cpp    

compose.o: compose.cpp

alphamask.o compose.o:
    ${CC} ${CFLAGS} -c $<

现在我们可以用.o模式规则替换对象 ( ) 规则:

all: alphamask compose

alphamask: alphamask.o

compose: compose.o

alphamask compose:
    ${CC} ${LFLAGS} -o $@ $^ ${LDFLAGS}

%.o: %.cpp
    ${CC} ${CFLAGS} -c $<

以及可执行文件的静态模式规则。(我们也可以对这些使用模式规则,但这有点太笼统了。)

EXECUTABLES = alphamask compose

.PHONY: all
all: $(EXECUTABLES)

$(EXECUTABLES): % : %.o
    ${CC} ${LFLAGS} -o $@ $^ ${LDFLAGS}

%.o: %.cpp
    ${CC} ${CFLAGS} -c $<

当你做出这些改进时,在你进行下一个改进之前,让每一个改进都完美运行。

于 2012-09-28T03:44:54.177 回答
1

我很确定您需要一个规则来制作它们(对两个项目都使用依赖项):

    all: ${ALPHA} ${COMP}

然后当然是:

make all
于 2012-09-28T02:22:25.127 回答