0

私はこのフォルダ/ファイル構造を持っています:

./libs/
    helpers.c
    helpers.h
./a_app.c
./b_app.c
./c_app.c

各アプリはヘルパー lib と に依存するため、 (フォルダー内で)GStreamerコンパイルしてから各アプリをリンクする必要があります。helpers.olibs/

現在、私はこの Makefile を持っています:

CC      =   gcc
CFLAGS  =   -g -Wall -w
LFLAGS  =   -g -Wall -w -c

CFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`
LFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`

LDFLAGS =
LDFLAGS +=  `pkg-config --libs gstreamer-app-0.10`

all: examples

examples: helpers.o a_app
    $(info *** examples ***)

helpers.o:
    $(info *** helpers.o ***)
    $(CC) $(LFLAGS) libs/helpers.c -o libs/helpers.o $(LDFLAGS)

a_app: a_app.o
    $(CC) $(CFLAGS) libs/helpers.o a_app.o -o a_app $(LDFLAGS)

a_app.o: a_app.c
    $(info *** a_app.o ***)
    $(CC) $(LFLAGS) a_app.c $(LDFLAGS)

追加できますが、別の(よりエレガントな)方法b_appc_app探しています。a、b、c の _app があり、Makefile にそれらすべてをコンパイルさせて、GStreamer とヘルパーにリンクさせることができますか?

また、Makefile にファイルをコンパイルさせる方法はありますか-o name_of_file(そして、ヘルパー ライブラリのため、ファイルが存在するフォルダーでコンパイルするようにすることもできます)。

4

1 に答える 1

2

さて、コメントで説明したように、make は .o ファイルを作成する方法を理解できるので、それらの規則は不要です。すべての *_app ファイルに対して一般化されたルールを作成するには (すべてのファイルが helpers.h に同じ依存関係を持っていると仮定すると、次のようにすることができます。

%_app: %_app.o libs/helpers.o

Make は % をワイルドカードとして使用し、ルール/依存関係の行では、ワイルドカードは依存関係でもルールと同じものに展開されます。実際の実行では$*、同じ文字列を取得するために使用できます。したがって、すべての *_app 実行可能ファイルに対する単一のルールは、次のようになります。

%_app: %_app.o libs/helpers.o
    $(CC) $(CFLAGS) libs/helpers.o $*_app.o -o $*_app $(LDFLAGS)

私は自分のマシンでこれをテストしていました(したがって、回答の代わりにコメントがあり、この Makefile を作成することになりました:

CC      =   gcc
CFLAGS  =   -g -Wall -w
LFLAGS  =   -g -Wall -w -c

CFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`
LFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`

LDFLAGS =
LDFLAGS +=  `pkg-config --libs gstreamer-app-0.10`

new: clean all

clean:
    rm -rf *.o */*.o *_app

all: examples

examples: a_app b_app

%_app: %_app.o libs/helpers.o
    $(CC) $(CFLAGS) libs/helpers.o $*_app.o -o $*_app $(LDFLAGS)

それはすべて意味がありますか?

EDIT:GNU Makeがコマンドラインでいくつかのコマンドを実行し、独自の目的で文字列を保存できることがわかりました。

$(shell ls *_app.c | sed 's/.c//') は、現在のディレクトリにあるすべてのアプリに展開されます。だからあなたは言うことができます:

examples: $(shell ls *_app.c | sed 's/\.c//')

または、私が思うに少し良いです:

...
ALLAPPS = $(shell ls *_app.c | sed 's/\.c//')
...
all: $(ALLAPPS)

その方法makeは、すべてを作成するためにmake ?_app使用でき、一度に 1 つのアプリをコンパイルするために使用できます。

スーパーウルトラメガダブル EDIT:

bald%オペレーターをターゲットとして使用すると、.o ファイルを自動生成する Make の機能が無効になります。チャットで解決した解決策は次のとおりです。

CC      =   gcc
CFLAGS  =   -g -Wall -w
LFLAGS  =   -g -Wall -w -c

CFLAGS  +=  $(shell pkg-config --cflags gstreamer-app-0.10)
LFLAGS  +=  $(shell pkg-config --cflags gstreamer-app-0.10)

LDFLAGS =
LDFLAGS +=  $(shell pkg-config --libs gstreamer-app-0.10)

TARGETS = $(shell ls *.c | sed 's/\.c//')

new: clean all

clean:
rm -rf *.o */*.o *_app

all: examples

examples: $(TARGETS)

.SECONDEXPANSION:
$(TARGETS): libs/helpers.o $$@.o
$(CC) $(CFLAGS) libs/helpers.o $@.o -o $@ $(LDFLAGS)
于 2013-03-19T12:25:48.640 に答える