1

私はこの単純な構造を持っています:

.
test.c
plugins/a.c
plugins/b.c
plugins/c.c

そして、これをbashスクリプトでコンパイルしています:

gcc -o test test.c -std=gnu99 -ldl -Wl,--export-dynamic

gcc -c plugins/a.c -o plugins/a.o -pedantic -g -Wall -std=c99 -fpic -I.
gcc plugins/a.o -o plugins/a.so  -shared

...same for b and c...

とにかく、それを Makefile に移植したい。ここに私が持っているものがあります:

CC          =   gcc

PLUGIN_DIR  =   plugins
PLUGINS_C   =   $(wildcard $(PLUGIN_DIR)/*.c)
PLUGINS_O   =   $(patsubst %.c,%.o, $(PLUGINS_C))

new: clean all

all: test plugins

test: test.o
    $(CC) -o $@ $^ -std=gnu99 -ldl -Wl,--export-dynamic

plugins:
    ???

$(PLUGIN_DIR)/*.c:
    $(CC) -c $(PLUGIN_DIR)/$@ $^ -pedantic -g -Wall -std=c99 -fpic -I.

$(PLUGIN_DIR)/*.o:
    $(CC) $@ $^ -shared

clean:
    rm -rf test *.o *.a plugins/*.o plugins/*.so

しかし、ルールが空であるため、これは機能しません。フォルダーplugins内のすべてのプラグインをコンパイルするには、そこに何を書き込む必要があるかを実際に見つけることができません。また、とpluginsをめちゃくちゃにしたかどうかもわかりません。$@$^

4

1 に答える 1

2

あなたの質問にたどり着く前に、メイクファイルには多くの問題があります。

ルール ターゲットのワイルドカード文字は( のような行では) あり%ません。*$(PLUGIN_DIR)/*.c:

ルールは、ターゲット/ターゲット パターンによって名前が付けられたファイルがどのように構築されるかを指定します。したがって、あなたの%.cルールは、make に .c ファイルの作成方法 (同意していただけると信じています) を伝えていますが、これはまさにあなたが意図したものではありません。(同様に、%.oルールは make に .o ファイルの作成方法を指示しています)。

ビルド ルールの前提条件 (ターゲット行の右側:) がリストされていないため、前提条件が変更されたときにターゲットをインテリジェントに再構築できません (代わりに再構築することはありません)。

あなたの質問にたどり着くには、おそらくプラグインターゲットの本体には何も必要ありません。代わりに、目的のプラグイン出力ファイル (.so ファイル) をpluginsターゲットの前提条件としてリストします。(実際のファイルではなく偽のターゲットである.PHONY: pluginsことを make に伝えるために、makefile に含めることもできます。)plugins

あなたの%.soルールは次のようになりたいです:

$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o
        $(CC) $^ -o $@ -shared

そして、あなたの%.oルールは次のようになりたいです:

$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.c
        $(CC) -c $< -o $@ -pedantic -g -Wall -std=c99 -fpic -I.
于 2013-11-10T18:36:50.057 に答える