2010-11-28 10 views
9

"main.c"というファイルがあります。最も単純なMakefileは何ですか?./blahのように実行できる実行可能ファイルにこのファイルをコンパイルする必要がありますか?最も単純なMAKEFILEは何ですか?私は単一のCファイルのための作品を持つことができましたか?

+0

:これはまだ、すべての上記の利点を保ち、次Makefileで行うことができます。あなたの教授があなたにMakefileを使用してもらいたい理由があるので、より有用なプロジェクトのためにMakefileを書く方法を学ぶことができます。 –

+3

申し訳ありませんが、宿題の警察を動揺させることを意味しませんでした。私はそれをグーグルで試してみましたが、Makefileは明らかに信じられないほど強力で、非常に複雑です。私はそれの多くを理解するいくつかの問題を抱えていると認めています。このサブジェクトはプログラミング対象ではありませんが、CコードでネイティブOS関数を呼び出す必要があります。私は以前はCに触れていませんでしたが、この課題は数時間で完了します。私は不満を抱き、絶望的でしたし、何か助けが必要でした。ごめんなさい。 – Ash

答えて

9
all: 
    gcc -o blah main.c 

ここでメイクファイルは必要ありません。単純なシェルスクリプトはOKです。

+0

割り当てシート私たちはMakefileを含める必要があると言います。 – Ash

+0

これを使用して 'make'を実行すると、" Makefile:2:*** missing separator。Stop "が返されます。 – Ash

+1

@Ash: 'gcc'の前のビットはスペースではなくタブでなければなりません。 –

4
all: blah 
blah: main.c 
    gcc main.c -o blah 
+0

私は何かが表示される前に自分の答えを書いて投稿しましたが、私は「宿題」タグを見ませんでした。私はChris Lutzに同意します。あなたはそのような惨めな課題に助けを求める人生のどこにもいないでしょう。 –

+1

'all:blah'はこれを単純化し、それが必要であり、' all'というファイルが実際に存在する場合にはそれを破ることもあります。この点を除いて、これは最良の答えです。 –

+0

実際、さらに考えてみると、この単純なケースでは、 'all'というファイルはおそらく依存性チェックを破ることはないでしょう。いずれにしても、最初のターゲットをデフォルトのターゲットとして扱うため、makeはまだ冗長です。 –

10

あなたはGNUが作成し、あなたが余分なライブラリにリンクする必要がない場合は、実行している場合は、最も簡単なメイクファイルがまったくメイクファイルではありません。試してみてください:

make main 

あなたは、あなたは、次の1行のMakefileを使用することができ、mainを指定する必要がしたくない場合は、次の

all: main 

GNUあなたならばそれが使用するいくつかの暗黙のルールがあることを確認し自分で定義しないでください。詳細情報については

%: %.c 
     $(CC) $^ -o [email protected] 

、以下を参照してください:この作品のようなものである可能1 http://www.gnu.org/software/make/manual/make.html#Using-Implicit

+0

明らかに、出力は 'main'ではなく' blah'でなければならないので、Makefileが必要になります。上記はまだ有用な情報ですが、ここで実際には適用されません。 –

+1

実行ファイルを 'blah'と呼ぶべき場合は、許可されていればソースファイルの名前を' blah.c'に変更するのが最も簡単です。 –

+0

@ T.J.Crowder: 'blah'は要件ではなく、むしろ例です:OPは"私が* like * 'を実行できると言った。/ blah'"ですから、この1行の 'Makefile'はうまくいくようです – MestreLion

2

は私が推薦する最も簡単です:暗黙のルール経由

myprog: myprog.o 
     $(CC) -o [email protected] @^ 

、これはになりますそれをリンクする前にmyprog.cmyprog.oにコンパイルする別のステップ。私は(アルノーによって)他の回答よりも、この方が好きな理由は、それが大幅にメイクファイルを拡大することなく、より多くのソースファイルにスケールということである。

myprog: myprog.o foo.o bar.o helper.o my.o your.o his.o her.o 
     $(CC) -o [email protected] @^ 
+0

' @^'の代わりに' $^'でなければなりませんか? – user2023370

0

Janderは、あなたのソースがという名前の単一のファイルであれば、言ったようにblah.c

all: blah 

あるいは:あなたは出力にblahという名前の実行可能ファイルを、これを使用することができ、他の

blah: 

すべてがありますこれは非常に簡単ですがGNU make

使用した場合、暗黙的な、それはより複雑な答えの一部の上にいくつかの利点を持っている:

  • コンパイラがハードコードされていません:ご使用の環境があなたのためgccを選択してみましょう!
  • あなたのプログラム名は一度しか設定されていません。良いDRYプログラミングの習慣です。
  • この単純なプロジェクトでは不要な中間ファイル*.oを作成しません。言っ

、私は強くあなたが少なくともcleanallルールと-Wallフラグを追加してMakefileを向上させることが示唆されました。私たちを尋ねる前に、あなたの宿題をするためにいくつかの努力をしてください

 
TARGET=blah 
CFLAGS=-Wall 

.PHONY: all clean 

all: $(TARGET) 

$(TARGET): 

clean: 
    rm -f $(TARGET) 
関連する問題