単純な解決策があります。コマンドラインで渡せる変数を作ります。それらはMakefileの定義よりも優先されます。あなたがリンクするだけa
とb
たい場合
$ cat Makefile
SRCS = $(filter-out main,$(patsubst %.cpp,%,$(wildcard *.cpp)))
main: main.o $(patsubst %,%.o,$(SRCS))
$(CXX) -o [email protected] $^
clean:
rm -f $(wildcard *.o) main
次に、:
$ make clean
rm -f a.o b.o main.o main
$ make SRCS="c d"
c++ -c -o main.o main.cpp
c++ -c -o c.o c.cpp
c++ -c -o d.o d.cpp
c++ -o main main.o c.o d.o
とデフォルト:
$ make SRCS="a b"
c++ -c -o main.o main.cpp
c++ -c -o a.o a.cpp
c++ -c -o b.o b.cpp
c++ -o main main.o a.o b.o
あなただけc
とd
をリンクしたい場合
$ make clean
rm -f c.o d.o main.o main
$ make
c++ -c -o main.o main.cpp
c++ -c -o a.o a.cpp
c++ -c -o b.o b.cpp
c++ -c -o c.o c.cpp
c++ -c -o d.o d.cpp
c++ -o main main.o a.o b.o c.o d.o
デフォルトが意味を持たない場合(例:メソッドは)複数のソースファイルで定義されているので、MakefileでSRCS
のデフォルト値を変更します。
SRCS = a b
注:変数を作る混在していない、定義は、コマンドラインでmake
コマンドの後に表示されます:make ... VAR=VALUE ...
をし、 make
プロセスに渡すことができる環境変数は、VAR=VALUE make ...
です。両者の間には関係があるが、まったく違うものである。
これはxyの問題のようです。ソースファイルを任意の組み合わせで実行可能な実行可能ファイルにすることはできません。そのため、組み合わされる組み合わせにはいくつかの構造があり、その構造は何が「良い」解決策になるかを指示します。 [私は推測の危険があるかもしれません]あなたが達成しようとしていること、これが一部であることを述べる方が生産性が高いかもしれません。 – lockcmpxchg8b
私は@ lockcmpxchg8bに同意します。なぜ異なるファイルセットを動的にリンクしたいのかを説明すると、おそらくもっと良い答えが得られるでしょう。 –