2012-03-20 10 views
7

私は現在C++を勉強しています。現在のディレクトリにあるすべてのcppファイルをコンパイルして実行ファイルを分割するmakefileが必要です。たとえば、ディレクトリ内のすべてのcppファイルを個別の実行可能ファイルにコンパイルするMakefile

ディレクトリには3つの、C++ファイル、などexamp1.cpp、examp2.cppexamp3.cppがあります。私は、コンパイルしてそれらをリンクしてexamp1.exeを与えるメイクをしたいとexamp3.exe

私はそれらのすべてをコンパイルし、EXEファイルを作成するために、bashスクリプトを作成しましたが、私は思うをexamp2.exe。それはこれを行う正確な方法ではありません。

".c"のMakefileがありますが、ここでは動作しません。オブジェクトファイルを作成するだけで、実際にはリンクされません。以下のようになります:

SRCS=$(wildcard *.c) 
OBJS=(SRCS:.c=.o) 
all: $(OBJS) 

上記のコードは、現在のディレクトリに同じ名前を持つすべての新規および変更「.C」ファイルを「の.o」ファイルをコンパイルします。

次のように私は実行可能ファイルを作成するために使用していbashスクリプトは次のとおりです。

for i in ./*.cpp 
do 
    g++ -Wno-deprecated $i -o `basename $i .cpp`".exe" 
done 

これは私が単純な 『作るすべて』か何かを使用することによって、そのディレクトリに置くものは何でも「.cppファイル」のファイルたい意味それはコンパイルする必要がありますように。

all: examp1.exe examp2.exe examp3.exe 

あなたの三つのプログラムを作成するために、makeのデフォルトのルールを使用すること:

+4

メイクファイルを作成しようとしましたか?もしそうなら、私たちはあなたを助けることができるように投稿します。開始するには[documentation](http://www.gnu.org/software/make/manual/make.html)があります。 – Joe

+1

makeのバージョンは、サプライヤごとに異なります。あなたは何を使っていますか? LinuxでGNU Makeを使用していますか? Windows/Visual C++でのMicrosoft Make? –

+1

* 1つの*ソースファイルをコンパイルして実行可能ファイルを生成するmakefileを作成しようとしましたか? – Beta

答えて

16

最小限のMakefileは次のようになります。

#Tell make to make one .out file for each .cpp file found in the current directory 
all: $(patsubst %.cpp, %.out, $(wildcard *.cpp)) 

#Rule how to create arbitary .out files. 
#First state what is needed for them e.g. additional headers, .cpp files in an include folder... 
#Then the command to create the .out file, probably you want to add further options to the g++ call. 
%.out: %.cpp Makefile 
    g++ $< -o [email protected] -std=c++0x 

あなたが使っているコンパイラによってグラムを++交換し、おそらくいくつかのプラットフォーム固有の設定を調整する必要がありますが、メイクファイル自体は動作するはずです。

+0

このMakefileを使用します。例えば ​​"hello.cpp"というファイルがある場合、 "make hello"を使う必要があります。私が上記のMakefileを使用すると、「すべての人には何もしない」というメッセージが表示されます – kaushik

+0

試しましたか?それは2行目で、make allコマンドがディレクトリ内にある.cppファイルごとに1つの.outファイルを必要とすることを指定しているので、make allを呼び出すとmake hello.outのようになります。 .outなど。もちろん、ルールが指定されているので、make hello.outを使用することもできますが、それは必要ありません。 – Haatschii

+0

もう一度やり直してみてください。$(ワイルドカード* .cpp)を – Haatschii

1

最も簡単なあなたはそれがあなたのために働くかもしれない作成することができMakefileがこれです。何をしたいん

3

これは、私はあなたがどこかにあなたの家でそれを貼り付け、あなたがdirctoryを変更するたびにちょうどそこにそれをコピーしてください

CC = gcc 
CFLAGS = -g -O2 -std=gnu99 -static -Wall -Wextra -Isrc -rdynamic -fomit-frame-pointer 
all: $(patsubst %.c, %.out, $(wildcard *.c)) 
%.out: %.c Makefile 
    $(CC) $(CFLAGS) $< -o [email protected] -lm 
clean: 
    rm *.out      

を使用することのMakefileです。私はそれが

alias get_makefile_here='cp ~/Makefile ./' 

単にmakeとBAMを押してコピーするには、私の〜/ .basrcでエイリアスを使用、完了です。また、古いファイルが完了したら、実行可能ファイルを再構築しないことにも注意してください。

関連する問題