0

1 つの Makefile でマクロを使用して、2 つのプログラムをコンパイルしたいと考えています。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

2 番目のプログラムのみをコンパイルします。マクロで両方のプログラムをコンパイルする方法はありますか? これが私の現在の 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これらのルールを書き直し、上部に1つ追加して、両方のファイルを次のようにビルドできるようにします。

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 に答える