15

単一の DLL (プラグイン システム用) をコンパイルするためのメイクファイル テンプレートがあります。ユーザーのメイクファイルは次のようになります。

EXTRA_SRCS=file1 file2
include makefile.in

私が持ってmakefile.inいる:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))

plugin.osコンパイルするメインの C++ ファイルはどこにありますか。ところで、末尾のファイルは.os、共有ライブラリ用にコンパイルされたオブジェクト ファイルです (つまり、 with の-fpicオプションを使用gcc) 。

ここでの問題は、余分なソースがおそらく (必ずしもそうとは限りませんが) ヘッダー ファイルになることです。plugin.os理想的には、それらをターゲットとの依存関係として追加したいと思いますがfile.cpp、それらが存在する場合に限ります。

この方法は、Windows と Linux の両方で機能するか、少なくともそれぞれに適応できる必要があります。ただし、GNU バージョンの make しか使用していません。

4

3 に答える 3

19

「ワイルドカード」機能を使用します。

$(wildcard *.h)

編集:特定のリストと一致させるために、

$(wildcard $(HEADER_FILES))

$(filter ...)を使用する必要はありません。ワイルドカード関数は、存在しないファイルを自動的にフィルタリングします。

于 2008-10-30T13:25:56.407 に答える
5

使用しているコンパイラを指定していませんが、gcc/g++ にアクセスできる場合は -MM オプションを使用できます。

私がしていることは、すべての .c または .cpp ファイルに対して .d の拡張子を持つファイルを作成し、.d ファイルを「含める」ことです。Makefile で次のようなものを使用します。

%.d: %.c
        gcc $(INCS) $(CFLAGS) -MM $< -MF $@

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@

次に、次のような依存関係を作成します。

C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)

これは Makefile の一番下にあります:

include $(DEPS)

これはあなたがしようとしている行動の種類ですか?この方法の優れた点は、実際のコンパイルに GNU 以外のコンパイラを使用している場合でも、GNU コンパイラが依存関係を適切に計算することです。

于 2008-10-30T16:20:19.080 に答える
3

シンプルですか

$(filter $(wildcard *.h),$(HEADER_FILES))

あなたがしたいことをしますか?

于 2008-10-30T16:30:21.790 に答える