2017-12-09 9 views
0

それはmakefileに関するもので、makefileがcppファイルを動的にコンパイルできるかどうか疑問です。makefileを動的に使ってC++コードをコンパイルする

は、私はmain.cppに、a.cpp、b.cpp、およびc.cppファイルがあるとします。(おそらくd.cpp、e.cppとよりを追加することができます)

main.cppにファイルがメインを持っています()関数とa、bとcはそれぞれ独自の関数を持っています。

時にはmain.cpp、a.cpp、b.cppファイルをコンパイルしてリンクしたいだけです。

ただし、main.cpp、b.cpp、c.cppファイルをコンパイルしてリンクすることがあります。 コンパイルするファイルのルールがありません。私は

のようなものですが、AB

は、BC

は、指定したファイル名のみをすることができ、交流

または

メイクABC

を作る作る作ると思う何

main.cppファイルとコンパイルしてリンクします。

これを行うには良い方法がありますか?

ありがとうございます。

+3

これはxyの問題のようです。ソースファイルを任意の組み合わせで実行可能な実行可能ファイルにすることはできません。そのため、組み合わされる組み合わせにはいくつかの構造があり、その構造は何が「良い」解決策になるかを指示します。 [私は推測の危険があるかもしれません]あなたが達成しようとしていること、これが一部であることを述べる方が生産性が高いかもしれません。 – lockcmpxchg8b

+0

私は@ lockcmpxchg8bに同意します。なぜ異なるファイルセットを動的にリンクしたいのかを説明すると、おそらくもっと良い答えが得られるでしょう。 –

答えて

1

単純な解決策があります。コマンドラインで渡せる変数を作ります。それらはMakefileの定義よりも優先されます。あなたがリンクするだけabたい場合

$ 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 

あなただけcdをリンクしたい場合

$ 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 ...です。両者の間には関係があるが、まったく違うものである。

関連する問題