2016-07-17 6 views
0

を作るためにはありませんルール私は2つのCソースファイルを持ち、prog2.cgetopts.c .MY prog2.cgetopts.cファイルは、各other.Iにリンクされている私の割り当てから、次のメイクファイルを作りました方向:(私はここでシェルされると信じて)、最終的なリンクのために私はefileは、実行可能ファイルがどこにあるgcc -o efile <ofiles>を使用する必要があるとOFILESはすべて.oファイルのリストです:メイク:*** [クリーン]エラー1とターゲット・エラー

OPTS= -g -c -Wall -Werror 
efile = shell 
ofile = prog2.o getopts.o 
all: gcc -0 $(efile) <$(ofile)> 

shell: \ 
prog2.o getopts.o 
    gcc prog2.o getopts.o -o shell 

prog2.o: \ 
prog2.c 
    gcc $(OPTS) prog2.c 

getopts.o: \ 
getopts.c 
    gcc $(OPTS) getopts.c 

clean: 
    rm $(ofile) $(efile) 

方向は述べています。その後、make cleanmakeというコマンドを実行するように指示されました。make cleanコマンドの場合、次のエラーが表示されます。削除できません...ファイルまたはディレクトリのエラーがありません。make:***[clean] Error 1.makeコマンドを実行すると、次のエラーが表示されます。 'all'が必要とするターゲット 'gcc'を作るルールはありません。やめる。私はいくつかのWebページや同様の質問を行ったが、実際にはそれを取得していない。

+0

'gcc -0 $(efile ...'は次の行にあり、タブが前面に来るようにしてください - ビルドするコマンドではなく、 'all'の依存関係として理解されています。それは '-0'ではなく' -o'でなければなりません – Dmitri

+0

make cleanコマンドでも同じエラーが発生し、makrに対しては次のような新しいエラーが発生します:makeコマンドの予期しないトークンの近くでシンタックスエラーが発生しました –

+0

'<$(ofile)>'の代わりに '$(ofile)'を試してみてください。あなたが指定したファイルが存在しないので、 'make clean'エラーが多分あります。(' rm'だけではなく 'rm -f'エラーが発生しました) – Dmitri

答えて

1

最初に、makeファイルにターゲットをビルドするコマンドは、ターゲット名と同じ行ではなく、それぞれの前にタブを持つ次の行にあるので、gcc -0 $(efile) <$(ofile)>は間違った場所。

第2に、方向の山括弧は、おそらく実際にあなたのコマンドに表示されていなかったと思われます。

ターゲットが他のターゲットを最初に作成する必要がある場合、それらのターゲットはターゲット名の後にコロンで区切られた依存関係としてリストされます。

gccの出力ファイルを指定するオプションは-0ではなく-oです。

だからあなたallターゲットは、次のようになります。

all: $(ofile) 
    gcc -o $(efile) $(ofile) 

成功したビルドが行われていなかったとして、それを削除しようとしたファイルは、存在しなかったので、make cleanを実行すると、発生したエラー。 "force"オプションをrmに追加すると、「存在しないファイルと引数を無視し、プロンプトを出さない」ため、ファイルが見つからなくても、makeが不平を言ってもコマンドが成功するようになります。だから、次のようになります。それらのすべてが構築され得るように、それぞれが「すべて」自分の目標を持って、そしてメイクファイルで構築されたものは通常、個々のプログラムやライブラリかかわら

clean: 
    rm -f $(ofile) $(efile) 

注意が通常ちょうどそれらのそれぞれに依存します...あなたが持っているように "すべての"ターゲットを使用するのは少し珍しいことです。

関連する問題